Я сравнивал показатели между этими двумя способами инициализации динамического массива:
Arr := TArray<integer>.Create(1, 2, 3, 4, 5);
и
SetLength(Arr, 5);
Arr[0] := 1;
Arr[1] := 2;
Arr[2] := 3;
Arr[3] := 4;
Arr[4] := 5;
Я подготовил тест, и я заметил, что использование "конструктора" массива занимает в два раза больше времени, требуемого другим методом.
Тест:
uses
DateUtils;
function CreateUsingSetLength() : TArray<integer>;
begin
SetLength(Result, 5);
Result[0] := 1;
Result[1] := 2;
Result[2] := 3;
Result[3] := 4;
Result[4] := 5;
end;
...
const
C_COUNT = 10000000;
var
Start : TDateTime;
i : integer;
Arr : TArray<integer>;
MS1 : integer;
MS2 : integer;
begin
Start := Now;
i := 0;
while(i < C_COUNT) do
begin
Arr := TArray<integer>.Create(1, 2, 3, 4, 5);
Inc(i);
end;
MS1 := MillisecondsBetween(Now, Start);
Start := Now;
i := 0;
while(i < C_COUNT) do
begin
Arr := CreateUsingSetLength();
Inc(i);
end;
MS2 := MillisecondsBetween(Now, Start);
ShowMessage('Constructor = ' + IntToStr(MS1) + sLineBreak + 'Other method = ' + IntToStr(MS2));
Тестирование на моей машине, результирующие значения всегда близки к следующему:
Конструктор = 622
Другой метод = 288
Почему массив "конструктор" настолько медленный?