Windows 10에서 Delphi 10.1 Berlin을 사용합니다.큰 레코드의 TList를 반복 할 때 긴 지연이 발생했습니다.
크기가 다른 두 개의 레코드가 있습니다. 나는이 두 개의 레코드를 두 번 반복하여 경과 시간을 테스트하는 코드를 작성했다. 큰 레코드 목록을 반복하면 훨씬 느리게 실행됩니다.
누구나 이유를 설명하고 루프를 빠르게 실행할 수있는 솔루션을 제공 할 수 있습니까?
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 개의 항목을 반복하는 데 오랜 시간이 걸리지 않습니다. 어쩌면 작업 스위치, 캐시 누락 등과 같이 루프를 통해 예상치 못한 일시 중지가 있었을 수도 있습니다. 루프를 한 번 타이밍하는 것은 루프가 얼마나 빨리 실행되는지를 잘 나타내지 않습니다. 동일한 루프를 여러 번 실행하여 각 루프의 시간을 평균화하십시오. 그것은 당신에게 더 나은 그림을 줄 것입니다. –