음.. 일반 타입에서 당연히 + 보다는 +=가 빠른게 맞구요. 어셈 명령이 하나만 쓰이니까요.
제가 +=와 +연산을 비교한 것은 메모리 복사 부분이 아닌 메모리 ReAlloc을 비교하기 위해서였는데 약간 오해가 있었지 않았나 싶군요. 굳이 정확한 비교를 하자면..
만약 HeapAlloc을 쓰지 않고 new를 이용한 메모리 할당을 했다면 할당된 크기를 바꾸려면 다음과 같이 하는게 일반적이죠.
char *pOriginal = new char[100];
// 초기화 루틴이 있다 치고..
char *pAdditive = new char[100];
// 초기화 루틴이 있다 치고..
// 여기서부터 크기 확대
char *pDummy = new char[100+100]; // 새로 할당받고
::CopyMemory(pDummy, pOriginal, 100); // 원본 복사하고
::CopyMemory(pDummy+100, pAdditive, 100); // 추가부분 집어넣고
delete[] pOriginal;
pOriginal = pDummy;
보통 이런 식이죠.
HeapAlloc/ReAlloc의 경우 원본에 대한 복사과정이 필요 없이 추가부분만 복사하면 되기 때문에 엄청난 속도가 나오는거구요.. Heap 알고리즘은 증말 놀라버라.. 쩝..
char *pOriginal = (char*)::HeapAlloc(GetProcessHeap(), NULL, 100);
// 초기화 루틴이 있다 치고..
char *pAdditive = new char[100];
// 초기화 루틴이 있다 치고..
// 여기서부터 크기 확대
pOriginal = (char*)::HeapReAlloc(GetProcessHeap(), NULL, pOriginal, 200);
::CopyMemory(pOriginal+100, pAdditive, 100);
....
이 부분에서 오는 속도의 차이를 얘기한겁니다.
이 두가지 방법은 서로 2배~3배 정도가 아니라 수천~수만배의 속도 차이가 나죠.
STL의 string의 경우 malloc을 사용하고, 증가할 경우 첫번째 방법처럼 임시공간 확보 후 복사과정을 거치는게 아니라 두번째 방법처럼 realloc을 이용해서 이루어집니다.
내부적으로는 결국 HeapReAlloc을 호출하는 것으로 알고 있습니다. GlobalAlloc 역시 HeapAlloc을 호출한다고 MSDN에 나와 있죠.
근데 실제 테스트를 해 보면 전혀 결과가 다르다는게 문제입니다.
TMemoryStream의 경우 확실하게 GlobalAlloc을 씁니다.
근데.. 제가 전에 속도비교를 해 봤을 때는 AnsiString이 가장 빠르고, TMemoryStream이 그 다음으로 빠르고, HeapAlloc을 사용한게 그다음으로 빠르게 나왔다는게.. 그게 문제죠. ㅠ ㅠ
한마디로 이해가 안됩니다.
참, 백일님이 질문하신 STL의 string의 경우 제 테스트 결과에서는 꼬래비였습니다. 뭐 이것도 예전에 테스트한거라서 정확하진 않지만 Builer 6.0환경에서 테스트한거니까 당연히 STLPort입니다.
아무리 AnsiString이 어셈으로 되어있다고는 하지만 그 속도는 정말 믿기지 않는 속도입니다.
앞서 += 연산자 테스트에서는 결국 Realloc 후에 데이터 복사과정까지 분명 다 거친 것인데.. 어찌하여 그런 스피드가 나올 수 있는건지..
GlobalAlloc도 결국 HeapAlloc을 호출하는 것으로 되어 있는데 왜 TMemoryStream의 Realloc속도가 HeapAlloc을 쓴거보다 더 빠르게 나오고.. 어찌하여 AnsiString의 Realloc 속도는 그리도 무시무시하게 나오는건지.. 아무리 봐도 모르겠습니다.
정말 HeapAlloc/ReAlloc, GlobalAlloc/ReAlloc을 써야 하는 부분에서는 차라리 AnsiString을 쓰는게 더 나은건지도.. 모르겠다는 생각이 듭니다.
: 그리고 STL의 string도 한 번 참고해보세요. STL은 물론 어셈블리 코드는 쓰지 않습니다.
: 또한 STL은 new를 쓰지 않고, 할당자(allocator)라는 메커니즘을 쓰는 차이가 있고요.
: 혹시 STL의 string과 AnsiString 중 어느 쪽이 더 빠른 지 아시는 분?
: (테스트하기가 귀찮아서리... ^^;)
: 그외에도 STLport에는 대용량의 문자열을 처리할 때 훨씬 빠른
: 비표준 컨테이너인 rope도 있습니다. 이것도 참고하시고요.
:
http://www.sgi.com/tech/stl/Rope.html
: