「リストに大量のアイテムを登録する – 思いつくままに」には、TListBoxに大量のアイテムを登録する場合、TListBox.AddItemよりもTStrings.Assignを使った方が高速に登録できることが書かれています。
TStrings.BeginUpdateとTStrings.EndUpdateを使うと、より高速に登録することができます。
TListBox.AddItemを使った例
procedure TForm1.Button1Click(Sender: TObject);
var
time: Cardinal;
i: Integer;
begin
ListBox1.Clear;
time := MilliSecondOfTheDay(Now);
for i := 1 to 10000 do
ListBox1.Items.Add(IntToStr(i));
time := MilliSecondOfTheDay(Now) - time;
ShowMessage(Format('It took for %d milliseconds to add 10000 items!',
[time]));
end;
手元の環境では3022ミリ秒かかりました。
TStrings.Assignを使った例
procedure TForm1.Button2Click(Sender: TObject);
var
time: Cardinal;
strings: TStrings;
i: Integer;
begin
ListBox1.Clear;
time := MilliSecondOfTheDay(Now);
strings := TStringList.Create;
for i := 0 to 10000 do
strings.Add(IntToStr(i));
ListBox1.Items.Assign(strings);
strings.Free;
time := MilliSecondOfTheDay(Now) - time;
ShowMessage(Format('It took for %d milliseconds to add 10000 items!',
[time]));
end;
手元の環境では225ミリ秒かかりました。
TStrings.BeginUpdateとTStrings.EndUpdateを使った例
procedure TForm1.Button3Click(Sender: TObject);
var
time: Cardinal;
i: Integer;
begin
ListBox1.Clear;
time := MilliSecondOfTheDay(Now);
ListBox1.Items.BeginUpdate;
for i := 1 to 10000 do
ListBox1.Items.Add(IntToStr(i));
ListBox1.Items.EndUpdate;
time := MilliSecondOfTheDay(Now) - time;
ShowMessage(Format('It took for %d milliseconds to add 10000 items!',
[time]));
end;
手元の環境では124ミリ秒かかりました。
まとめ
TStrings.BeginUpdate・EndUpdateを使った例…124ミリ秒
TStrings.Assignを使った例…225ミリ秒
TListBox.AddItemを使った例…3022ミリ秒
TStrings.BeginUpdate・EndUpdateを使う方法が最も高速になりました。
TStrings.Assignを使う方法に比べてソースコードの記述量も少なくてすみます。
TListBoxに大量のアイテムを高速に登録する場合は、TStrings.BeginUpdate・EndUpdateを使った方がよいようです。