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

C++빌더 Q&A
C++Builder Programming Q&A
[22141] AnsiString의 비밀은 뭘까?
김상구.패패루 [peperu] 1263 읽음    2002-10-21 19:32
이것도 예전에 품었던 궁금증인데요..

아시는 분은 아시겠지만 AnsiString의 SetSize 함수는 HeapRealloc 메카니즘을 이용합니다.
그래서 다음과 같이

String sTest;
String sAdd = "TestString";
for (int ii = 0; ii < 100000; ii++)
{
  sTest += sAdd;
}

이런 루프를 돌리는 것과

for (int ii = 0; ii < 100000; ii++)
{
  sTest = sTest + sAdd;
}

이런 루프를 돌리는 것은 속도가 천지차이가 나죠.

언젠가 이런 궁금증이 생겼습니다.
'HeapReAlloc을 직접 사용해서 같은걸 구현해 보면 AnsiString과 동일한 속도가 날까?'
라고..

HANDLE hProc = ::GetProcessHandle();
char *pAlloc = (char*)::HeapAlloc(hProc, NULL, 0);
char pAdd[] = "TestString";

int nCount = 100000 * 10;
for (int nLen = 0; ii < nCount; nLen+=10)
{
  pAlloc = (char*)::HeapReAlloc(hProc, NULL, pAlloc, nLen+10);
  ::CopyMemory(pAlloc+nLen, pAdd, 10);
}

::HeapFree(hProc, NULL, pAlloc);


최대한 속도에서 손해보지 않게 나름대로 구성해서 테스트해보니..
제 경우 딱 2배정도 더 늦더군요. 어떻게 해 봐도 AnsiString과 동등한 수준으로 빠르게 만들 수가 없었습니다.
::CopyMemory를 사용한 부분을 제거하면 동등한 속도가 나더군요.
쩝.. 그래서 혹시나 HeapReAlloc 말고 특정 메모리의 내용을 복사하면서 Realloc시켜주는 API를 찾아봐도 그런건 없더군요. Zero로 만드는 것 외에는.. Serialize 옵션을 빼고는 안해봤지만 뭐 그리 차이나지는 않을 것 같군요.

아무튼.. 그때 이런 생각을 했습니다.

아예 고속 동적 메모리 할당이 필요한 부분에 AnsiString을 쓰는게 훨씬 효율적이 아닐까...
new나 malloc, HeapAlloc, GlobalAlloc 이딴거 쓰지 말고.. ^^

메모리증가시키고 내용 복사하는 과정을 AnsiString만큼 빠르게 만드는 다른 방법은 없을까요?



PS. 음.. 써놓고 보니 왜 썼나 싶다.. 쩝..

+ -

관련 글 리스트
22141 AnsiString의 비밀은 뭘까? 김상구.패패루 1263 2002/10/21
22153     Re: 제 생각에는여... CCOL 983 2002/10/22
22156         Re: ^^ Capacity를 말씀하시는거군요.. 김상구.패패루 968 2002/10/22
22145     Re: AnsiString의 비밀은 뭘까? 김백일 1350 2002/10/21
22148         Re:Re: AnsiString의 비밀은 뭘까? 김상구.패패루 1667 2002/10/22
22146         Re:Re: AnsiString의 비밀은 뭘까? 만해 1193 2002/10/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.