改进目标是针对IndexOf效率,主要有两面:
1、设置Sorted属性
当Sorted= true,那么IndexOf则会调用Find二分查找法;当Sorted=False,则会从头比到尾,直至找到。
显然,Sorted = True可以取得较好的性能。
2、改进Find方法
IndexOf依赖于Find,Find调用API:AnsiCompareStr。这个API会考虑本地化语言因素,以及用户态和系统态的频繁切换,较耗CPU的。
type
public function Find(const S: string; var Index: Integer): Boolean; override; end;TStringListEnhanced = class(TStringList)
function TStringListEnhanced.Find(const S: string; var Index: Integer): Boolean; var L, H, I, C: Integer; begin Result := False; L := 0; H := Count - 1; while L <= H do begin I := (L + H) shr 1; C := CompareStr(Get(I), S); if C < 0 then L := I + 1 else begin H := I - 1; if C = 0 then begin Result := True; if Duplicates <> dupAccept then L := I; end; end; end; Index := L; end;