は、私はサイズの異なる二つのレコードを持っているWindowsの10長い遅延が
にデルファイ10.1ベルリンを使用しています。私は、経過時間をテストするためにこれらのレコードの2つのループTList<T>
をループするコードを書いた。大きなレコードのリストをループするのはずっと遅くなります。
誰もがその理由を説明し、ループをより速く走らせるソリューションを提供できますか?
type
tTestRecord1 = record
Field1: array[0..4] of Integer;
Field2: array[0..4] of Extended;
Field3: string;
end;
tTestRecord2 = record
Field1: array[0..4999] of Integer;
Field2: array[0..4999] of Extended;
Field3: string;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
_List: TList<tTestRecord1>;
_Record: tTestRecord1;
_Time: TTime;
i: Integer;
begin
_List := TList<tTestRecord1>.Create;
for i := 0 to 4999 do
begin
_List.Add(_Record);
end;
_Time := Time;
for i := 0 to 4999 do
begin
if _List[i].Field3 = 'abcde' then
begin
Break;
end;
end;
Button1.Caption := FormatDateTime('s.zzz', Time - _Time); // 0.000
_List.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
_List: TList<tTestRecord2>;
_Record: tTestRecord2;
_Time: TTime;
i: Integer;
begin
_List := TList<tTestRecord2>.Create;
for i := 0 to 4999 do
begin
_List.Add(_Record);
end;
_Time := Time;
for i := 0 to 4999 do
begin
if _List[i].Field3 = 'abcde' then
begin
Break;
end;
end;
Button2.Caption := FormatDateTime('s.zzz', Time - _Time); // 0.045
_List.Free;
end;
容量を使用することを検討してください!あらかじめすべてのエントリのリストを事前に割り当てることは意味があります。 –
@ ZENsanあなたが言っていることは一般的に真実ですが、時間を計られている時間には、リストを作成するのに費やされた時間は含まれず、それらをループする時間だけが含まれます。 –
'TTime'は特にタイムコードの正確な方法ではありません。代わりに['TStopWatch'](http://docwiki.embarcadero.com/Libraries/en/System.Diagnostics.TStopwatch)を使用してください。しかし、45msはリスト内の5000個のアイテムをループするのに長い時間はありません。おそらく、ループの途中に予期しない休止があったかもしれません。たとえば、タスクスイッチ、キャッシュミスなどです。ループを1回タイミングを立てることは、ループの速さの非常に良い表現ではありません。同じループを何度も実行し、各ループの時間を平均します。それはあなたに良い絵を与えるでしょう。 –