|
자세하게 소스를 살펴보지는 않았지만 이런 방식으로 원하시는 만큼의 속도를 낼 수 있을지 의문이군요..
일단, 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보다 훨씬 커집니다.
:
: 도움 부탁 드릴께요~
:
|