동적 메모리 할당(dynamic memory allocation)으로 많이 사용되는...
new 연산자와 malloc 함수가 있죠.
new 연산자는 C++에서 기본적으로 지원되는 연산자이며, malloc은 ANSI-C에 정의되어 있는
함수 입니다.
제 친구는 new 연산자만 쓰더군요. 전 C 언어부터 개발을 했기 때문에 malloc을 즐겨 썼죠.
서로 자기가 쓰는게 빠르다고 우기다가...
테스트를 한번 해봤습니다. 어떤게 빠른지...
500 바이트의 메모리 블럭을 100만번 생성했다가 해제시키는 예인데요.
(코드는 아래에 따로 첨부를 하겠습니다.)
테스트 결과는 malloc 함수의 속도가 new 연산자보다 1.3 배 정도 빠르게 나타났습니다.
뜻밖에 결과였죠.
당연히 new 연산자가 operator keyword 이기 때문에, 랭귀자 자체에서 빠르게 지원을 해줘서
빠를꺼 같았습니다만,
실제로는 함수 호출 과정을 거치는 malloc 함수가 더 빠르게 나타났습니다.
함수 호출 과정에는 지역 스택 생성 및 현재 CPU 레지스터 푸싱 작업이 이루어지죠.
그럼에도 불구하고 malloc이 빠르다는 것은 의외가 아닐 수 없었습니다.
아마도 이것은 C++ 특유의 Dynamic Linking 작업이 많아서 그런거 같은데요.
그렇다면???
TListItem *Item = new TListItem();
이렇게 하지 말고
Item = (TListItem *)malloc( sizeof(TListItem) );
이렇게 하면 어떨까요....?
생성자도 호출 안되고...
루프를 엄청나게 많이 도는 또는 호출되는 속도를 요구하는 작업에서는
2배의 이상의 속도 향상을 볼 수 있을꺼 같네요.
어쟀든 malloc()을 많이많이 애용해주자구요. ^^;;
ps. 제 친구가 똑같은 걸 VC++에서 짰는데 BCB 프로그램과 같이 동일 머신에서 돌렸을 때
메모리 할당 속도가 무려 4배나 느리게 나왔습니다....
VC++이요 -_-;;;;
역시 우수한 BCB 입니다. 음하하하하하하하... RAD 툴이라고 우습게 볼게 아니죠.
(옵션 차이일 가능성도 있습니다만.. BCB는 컴파일 기본 옵션)
---------------------------------------------------------------------------------------
// 테스트 소스
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int loop;
char *buffer;
int start, end;
start = GetTickCount();
// malloc 부분 // new 부분과 위 아래를 바꿔도 결과는 마찬가지~
for( loop=0 ; loop<=1000000 ; loop++ )
{
buffer = (char *)malloc(500);
free( buffer );
}
end = GetTickCount();
Label2->Caption = end - start;
// new 부분
start = GetTickCount();
for( loop=0 ; loop<=1000000 ; loop++ )
{
buffer = new char[500];
delete[] buffer;
}
end = GetTickCount();
Label1->Caption = end - start;
}
|