儘管10k項瘋狂地保留在TComboBox
之內,但這裏的一個有效策略是將緩存保存在單獨的對象中。例如,聲明:
{ use a TDictionary just for storing a hashmap }
FComboStringsDict : TDictionary<string, integer>;
其中
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
spw : TStopwatch;
begin
FComboStringsDict := TDictionary<string, integer>.Create;
spw := TStopwatch.StartNew;
{ add 10k random items }
for i := 0 to 10000 do begin
AddComboStringIfNotDuplicate(IntToStr(Floor(20000*Random)));
end;
spw.Stop;
ListBox1.Items.Add(IntToStr(spw.ElapsedMilliseconds));
end;
function TForm1.AddComboStringIfNotDuplicate(AEntry: string) : boolean;
begin
result := false;
if not FComboStringsDict.ContainsKey(AEntry) then begin
FComboStringsDict.Add(AEntry, 0);
ComboBox1.Items.Add(AEntry);
result := true;
end;
end;
添加10K項目最初需要大約0.5秒這樣。
{ test adding new items }
procedure TForm1.Button1Click(Sender: TObject);
var
spw : TStopwatch;
begin
spw := TStopwatch.StartNew;
if not AddComboString(IntToStr(Floor(20000*Random))) then
ListBox1.Items.Add('Did not add duplicate');
spw.Stop;
ListBox1.Items.Add(IntToStr(spw.ElapsedMilliseconds));
end;
但添加每個後續項目是非常快的< 1ms。這是一個笨拙的實現,但您可以輕鬆地將此行爲包裝到自定義類中。這個想法是保持你的數據模型儘可能與可視化組件分開 - 在添加或刪除項目時保持它們同步,但是在查找速度很快的字典上執行大量搜索。刪除項目仍然依賴於.IndexOf
。
只需修復底層問題。組合框中的10k項是荒謬的。什麼版本的delphi? –
@TomBrunberg Assign比AddStrings更慢 – siwmas
@J ...同意10k很荒謬,但這並不能改變這樣一個事實,即爲這樣的場景添加項目到combobox看起來效率很低?除非我錯過了什麼.. Delphi版本 - > XE3 – siwmas