1. 程式人生 > >【轉】誰說Delphi沒有雜湊?--Delphi中,TStringList和THashedStringList的效能對比

【轉】誰說Delphi沒有雜湊?--Delphi中,TStringList和THashedStringList的效能對比

曾經看到很多人在嚷嚷Delphi沒有雜湊表,這些人的動手意識姑且不論,卻還有很多人以此來證明Delphi比別的語言垃圾,實在是...

好,牢騷打住,轉接正題。

TStringList是我們常用的字串列表型別,用法就不在這裡贅述,但是,在資料其項數增多時,其搜尋(主要是name/key搜尋和indexof搜尋)效能會急劇下降,原因是TStringList的內部儲存使用了連結串列形式,而搜尋操作使用了迴圈遍歷方式。

值得高興的是,在iniFiles單元,Delphi為我們提供了THashedStringList型別,即,經過雜湊處理的TStringList,它繼承自TStringList,只是對搜尋方法進行了優化,因此,我們完全可以放心的在大量字串搜尋的時候使用它來代替TStringList,而需要改變的只是在:=的後面用THashedStringList.create來代替TStringList.create,但其速度卻提高了一個數量級。

為了顯示兩者間效能的差距,我寫了幾個簡單的語句來測試他們各自的特性。

編譯執行程式,其執行結果:

200000 項 TStringList 建立耗時:109毫秒
200 項字串搜尋 TStringList 耗時:11514毫秒
200000 項索引搜尋 TStringList 耗時:31毫秒
100000 項 TStringList 隨位置插入耗時:85828毫秒
100000 項 TStringList 0位置插入耗時:148734毫秒
--------------------
200000 項 THashedStringList 建立耗時:108毫秒
200 項字串搜尋 THashedStringList 耗時:188毫秒
200000 項索引搜尋 THashedStringList 耗時:15毫秒
100000 項 THashedStringList 隨位置插入耗時:63毫秒
100000 項 THashedStringList 0位置插入耗時:55640毫秒

(測試環境:Windows2003  SP1  +Delphi 2006 Update 2 HotFix1-9 +1G記憶體 +P-D2.8G雙核)


結果很明顯,兩者在建立的時候,效能並沒有差距(之前聽人說THashedStringList在增加和插入操作時會比 TStringList慢,在此並沒有顯示出來,不知道是不是因為THashedStringList並不是人們說的那樣,在每次插入項時都做雜湊操作,還請各位不吝賜教),而200 項字串搜尋(從1到2000000項勻距搜尋200項)中,兩者的效能竟差如此懸殊。其後的各項測試也在預料之中。

由此可見,THashedStringList能更好的代替我們常用的TStringList來工作,我們為什麼要拒絕呢?

另外,iniFiles單元還提供了TStringHash,但只是對key進行了雜湊操作,一般不常用。

注意:MilliSecondsBetween 標頭檔案 DateUtils

procedure TForm1.Button3Click(Sender: TObject);
var datePointer :TDateTime;
    hslTime :Int64;
begin
  datePointer := Now();
//......
  hslTime := MilliSecondsBetween(Now, datePointer);
  Memo1.Lines.Add('耗時:'+IntToStr(hslTime)+' 毫秒');
end;