프로그래밍/델파이

정렬된 TStringList의 Add와 Find에 대하여...

채윤아빠 2010. 11. 22. 00:55
728x90
반응형
특정 단어를 빠르게 검색하기 위하여 정렬된(Sorted := true) TStringList 객체를 사용하고 있었습니다. 그런데, 생각했던것 보다 성능이 매우 떨어졌습니다. 처음 구현할 때는 Find 메소드를 사용하지 않고 무조건 Add 메소드만을 이용했었습니다. Duplicates 속성에서 dupIgnore를 할당하여, 중복된 단어일 경우에는 음수 값을 반환할 것으로 생각했었기 때문입니다. 그래서 무조건 단어를 Add한 이후에 음수 값을 반환하면, 단어에 따른 부가 처리 부분을 수행하지 않도록 하였었습니다.

그러나 복병은 TStrings.Add 메소드에 있었습니다.

Duplicates := dupIgnore를 할당하였어도 Add 메소드는, 중복된 단어인 경우에는 해당 단어의 위치값을 반환하고, 중복되지 않는 새로운 단어라면 목록에 추가하고, 추가된 위치를 반환하였습니다. 즉, Add를 하면 반환값을 무조건 양의 정수였던 것입니다.(델파이 도움말에는 왜 이런 중요한 설명이 없는 것이었을까요 ㅠ.ㅠ;) 그래서 원하던 대로 성능이 나오지 않았었습니다. 양의 정수가 반환된 경우, 추가적으로 하는 작업이 있었는데, 그 작업에 좀 부하가 있었던 터라, 중복된 단어를 걸려내려던 의도가 전혀 동작하지 않았던 것이었습니다.

그래서 무조건 단어를 Add 하지 않고, 먼저 Find로 동일한 단어가 있는지 검사한 이후에 추가하도록 바꾸었더니, 예상한 성능을 보였습니다.

역시 메소드 하나를 사용하더라도, 제대로 정확히 알고 사용해야지 어중간한 상태에서 사용하다보니 이런 문제가 있었네요. ^^;