|
이것도 예전에 품었던 궁금증인데요..
아시는 분은 아시겠지만 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. 음.. 써놓고 보니 왜 썼나 싶다.. 쩝..
|