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
[22145] Re: AnsiString의 비밀은 뭘까?
김백일 [cedar] 1349 읽음    2002-10-21 21:19
김상구.패패루 님이 쓰신 글 :
: 이것도 예전에 품었던 궁금증인데요..
:
: 아시는 분은 아시겠지만 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;
: }
:
: 이런 루프를 돌리는 것은 속도가 천지차이가 나죠.

AnsiString 뿐만 아니라, 모든 다른 클래스의 경우도 += 가 +보다 빠릅니다.
예를 들어,
    Rational a, b, c, d, result;
일때
    result = a + b + c + d;     // 아마 이 연산에서는 각 operaor+를 호출할때
                                // 3개의 임시 객체 할당이 필요합니다.
                                // AnsiString 같으면 상당한 비용이 필요합니다.
보다
    result = a;                 // 하지만 여기에서는 모두 임시 객체가 필요 없죠.
    result += b;        
    result += c;
    result += d;
가 더 빠르죠.

: 언젠가 이런 궁금증이 생겼습니다.
: '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만큼 빠르게 만드는 다른 방법은 없을까요?

VCL은 공부하면 할수록 정말 대단한 라이브러리라는 생각이 드네요.
저도 AnsiString 소스를 들여다보다, 광란의 인라인 어셈블리 코드들을 보고 포기했다는...
볼랜드 프로그래머들이 얼마나 고수인지를 알 수 있는 예겠죠. ^^
이글 보시는 다른 분들 중에, 혹시 AnsiString의 구현에 대해 설명해 놓은 자료가 있는지 아시는 분?

그리고 STL의 string도 한 번 참고해보세요. STL은 물론 어셈블리 코드는 쓰지 않습니다.
또한 STL은 new를 쓰지 않고, 할당자(allocator)라는 메커니즘을 쓰는 차이가 있고요.
혹시 STL의 string과 AnsiString 중 어느 쪽이 더 빠른 지 아시는 분?
(테스트하기가 귀찮아서리... ^^;)
그외에도 STLport에는 대용량의 문자열을 처리할 때 훨씬 빠른
비표준 컨테이너인 rope도 있습니다. 이것도 참고하시고요.
http://www.sgi.com/tech/stl/Rope.html

+ -

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