C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[359] new, malloc 중에 어느 것이 빠를까요?
아제나 [azena] 13555 읽음    2002-08-23 18:28
동적 메모리 할당(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;
}

신명호 [ighting]   2002-08-26 17:14 X
제컴엔 p3, 667 입니다. 그런데.. malloc = 1021, new = 792 나왔습니다
김재구 [knis001]   2002-08-27 20:13 X
new는 메모리할당과 함께 생성자 루틴도 첵크를 해야하기때문에 malloc보다는 좀 힘에 부치겠죠.
서정국.새더 [mmouse]   2002-08-28 14:37 X
new 나 malloc 이나 결국 HeapAlloc을 사용합니다. 그리고 BCB에선 릴리즈나 디버그나 퍼포먼스가 비슷하게 나오지만 VC++ 에선 차이가 많이 나는 편입니다.
최상천 [kangnung]   2002-08-29 17:50 X
제컴은 펜티엄4 256메가인데 malloc는 411 이고 new는 631 나왔습니다.
풀이 [deulful]   2002-09-10 11:51 X
P3 1Ghz 인데   malloc = 581,  new = 471 나왔습니다.
찌요리~~ [barleytea]   2002-09-10 19:46 X
new 내부적으로 malloc을 호출하는 것으로 알고있습니다만....
찌요리~~ [barleytea]   2002-09-10 19:47 X
결국 메모리 할당은 malloc 함수의 효율 문제지... malloc 얼마나 빨리 호출하느냐의 문제는 아닙니다.
찌요리~~ [barleytea]   2002-09-10 19:48 X
ptmalloc, hoard malloc 등 다른 malloc 라이브러리도 있으니 함 써보시길..
찌요리~~ [barleytea]   2002-09-10 19:50 X
커다란 배열 생성할땐 virtualalloc 으로 필요한 메모리 커밋시킨 담에 생성자 직접 호출해 합니다(가능합니다 new.h 찾아보셈)
수야!╋ [sooya23]   2002-11-08 10:25 X
TStringList를 malloc 했을경우에는 메모리가 늘었다 줄었다하는부분을 직접해야될까요? 궁금 하넹 ㅡ_ㅡ;
처리자 [nayahc]   2003-01-29 10:05 X
대부분 malloc가 빠르게 나오는군요. 가끔은 거의 차이가 없을때도 있군요. ^^;
이호진 [likeall]   2003-04-09 16:28 X
저도 그렇게 알고 있습니다. new를 거쳐서 malloc을 호출하는것보다 당연히 malloc을 호출하는게 속도가 빠르겠죠 ^^

+ -

관련 글 리스트
359 new, malloc 중에 어느 것이 빠를까요? 아제나 13555 2002/08/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.