본문 바로가기

공부/컴퓨터

C 언어에서 동적 메모리 할당과 초기화에 따른 시간 차이

반응형
C 언어에서  연속적으로 동적할당(malloc)를 하고 풀어주는(free)것을 반복하는것이 빠를까?
아니면 한번 동적할당을 하고 초기화 시켜서 사용하고 그것을 풀어주는것이 빠를까?
( 물론 정답은 예상했던 대로 나왔다. )

그 궁금증으로 인해 다음과 같은 소스를 입력해서 차이를 알아 보았다.
===========================================================================================

01: #include <stdio.h>
02: #include <stdlib.h>
03: #include <sys/timeb.h>
04:
05: void someMethod1();
06: void someMethod2();
07:
08:
09: void main(void) {
10:         struct timeb start;
11:         struct timeb end;
12:
13:         ftime(&start);
14:         someMethod1();
15:         ftime(&end);
16:
17:         printf("for ( 1000000 ) { malloc(1024); free; } \n");
18:         printf("Start Time : %ld , %d\n",start.time, start.millitm);
19:         printf(" End  Time : %ld , %d\n",end.time, end.millitm);
20:         printf(" Diff Time : %ld , %d\n", end.time - start.time , end.millitm - start.millitm );
21:
22:         printf("\n\n\n");
23:
24:         ftime(&start);
25:         someMethod2();
26:         ftime(&end);
27:
28:         printf("malloc(1024) for ( 1000000 ) { memset(t,0,sizeof(t); } free; \n");
29:         printf("Start Time : %ld , %d\n",start.time, start.millitm);
30:         printf(" End  Time : %ld , %d\n",end.time, end.millitm);
31:         printf(" Diff Time : %ld , %d\n", end.time - start.time , end.millitm - start.millitm );
32:
33:
34: }
35:
36:
37: void someMethod1() {
38:         char *t;
39:         int i;
40:
41:         for ( i = 0 ; i < 1000000 ; i++) {
42:                 t = (char*)malloc(1024);
43:                 free(t);
44:         }
45: }
46:
47:
48: void someMethod2() {
49:         char *t;
50:         int i;
51:
52:         t = (char*)malloc(1024);
53:         for ( i = 0 ; i < 1000000 ; i++) {
54:                 memset(t,0,sizeof(t));
55:         }
56:         free(t);
57: }

===========================================================================================


결과는 다음과 같다.
===========================================================================================
for ( 1000000 ) { malloc(1024); free; }
Start Time : 1073155570 , 625
End  Time : 1073155571 , 609
Diff Time : 1 , -16



malloc(1024) for ( 1000000 ) { memset(t,0,sizeof(t); } free;
Start Time : 1073155571 , 609
End  Time : 1073155571 , 640
Diff Time : 0 , 31
Press any key to continue
===========================================================================================

결과를 보다시피 메모리를 잡았다 풀었다를 반복하는것보다
한번 잡고 새로 셋팅해주는 것이 약 3배나 시간이 짧게 걸렸다.

테스트 환경
Window XP, VS 6.0 , 확장자로 c 사용.
반응형