リストに大量のアイテムを高速に登録するには

リストに大量のアイテムを登録する – 思いつくままに」には、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を使った方がよいようです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください