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
[15096] Re:[만해] 중복 검사 루틴인데요
김상구.패패루 [peperu] 1164 읽음    2002-01-29 12:19
자세하게 소스를 살펴보지는 않았지만 이런 방식으로 원하시는 만큼의 속도를 낼 수 있을지 의문이군요..
일단, TList계열의 클래스를 쓰신 것 같은데.. TList의 프라퍼티를 잘 살펴보면 Capacity라는 맴버가 있습니다. 아이템을 하나 추가하고 Capacity값을 참조해 보시면 4가 할당되어 있을겁니다.
맨 처음에는 4개의 공간을 할당하고 다음은 8.. 이런식이죠. 아이템 수가 늘어날수록 Capacity사이즈는 기하급수적으로 커지게 됩니다.
즉, 1~4개까지 아이템을 추가할 때는 메모리 재할당이 일어나지 않지만 5개가 되는 순간 8개를 저장할 메모리를 할당하고 기존의 4개를 복사합니다.
아이템 수가 늘어날수록 당연히 재할당에 걸리는 시간이 엄청나게 늘어날 수 밖에 없습니다.
따라서 아이템 수가 3000개 이상, 수시로 추가 삭제 되는 경우에는 TList계열의 컨테이너를 쓰는 것은 거의 자살행위가 될 수 있습니다.

만해님이 원하시는 것은 stl의 map이나 multimap을 활용하시거나 AVLTree 알고리즘을 쓰셔서 해결하셔야 할 것 같군요. 그리고 지난번에 오프모임때 말씀 드린 것과 같이 화면 디스플레이는 TTreeView를 쓰시는 것 보다는 Virtual Tree 컨트롤을 쓰시는게 속도면에서 훨씬 유리해 보입니다.


만해 님이 쓰신 글 :
: 안녕하세요 만해 입니다.
:
: 제가 만드는 프로그램의 중복 검사 루틴인데요
:
: 좀 속도가 느려서
:
: 어찌 좀 빠른 방법 없을까 해서 질문 드립니다.
:
: 방금 체크 해 보니깐 약 20초 가량 걸리네요
:
: typedef struct {
: AnsiString URL;
: long Id;
: long Depth;
: bool IsVisited;
: bool IsDuplicate;
: }TTreeData;
:
: void __fastcall TMain::ProcessUrl(void)
: {// LinkString의 값을 가져와서 이미 저장되어 있는 TempStringList에
:  // 있는지 체크 있으면 제거 없으면 추가.
: int i = 0;
: int j = 0;
:
: TTreeData* tData;
:   for ( i = 0 ; i < LinkString->Count ; i++ )
:     {
:       TTreeData * pData = (TTreeData*)LinkString->Items[i];
:       pData->URL = Make_Regular_Url(pData->URL);
:       AnsiString tmp = pData->URL;
:
:       for ( j = 0 ; j < TempStringList->Count ; j++ )
:         {
:           tData = (TTreeData*)(TempStringList->Items[j]);
:           tData->URL = Make_Regular_Url(tData->URL);
:           AnsiString tTmp = tData->URL;
:           if ( tTmp == tmp )
:             break;
:         }
:       if ( j >= TempStringList->Count )
:          // j >= TempStringList->Count  즉 중복되는 값이 없다면
:         pData->IsDuplicate = false;
:       else
:         {
:           pData->IsDuplicate = true;
:           pData->Id = tData->Id;
:           pData->Depth = tData->Depth;
:         }
:       TempStringList->Add(pData);  // TempStringList에 추가.
:     }
: }
:
: 전형적인 버블 소트 형태인데요
:
: 너무 느려서요
:
: 제 컴에서 20초면 다른 컴에서는 얼마나 걸릴지 (제 컴 P4 1.7Ghz인데도 20초나 걸려요 흑~)
:
: 고수님들의 도움 부탁 드립니다.
:
: 참 그리고 TempStringList하고 LinkString을 비교하면
:
: 처음에는 TempStringList가 LinkString보다 작지만
:
: 나중에 갈수록 TempStiringList가 LinkString보다 훨씬 커집니다.
:
: 도움 부탁 드릴께요~
:

+ -

관련 글 리스트
15093 [만해] 중복 검사 루틴인데요 만해 801 2002/01/29
15096     Re:[만해] 중복 검사 루틴인데요 김상구.패패루 1164 2002/01/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.