{$MODE OBJFPC}
{$APPTYPE CONSOLE}
uses
SysUtils, gvector, Generics.Collections;
type
TLongIntVector = specialize TVector<LongInt>;
TLongIntList = specialize TList<LongInt>;
TLongIntArray = specialize TArray<LongInt>;
TData = TLongIntArray;
TMeasureProc = procedure(const Data: TData);
procedure Measure(const Desc: string; Proc: TMeasureProc; const Data: TData);
var
Start, Elapsed: QWord;
begin
Start := GetTickCount64;
Proc(Data);
Elapsed := GetTickCount64 - Start;
WriteLn(Desc, 'in ', Elapsed, ' ticks.');
end;
function GenData(Count: SizeInt): TData;
var
i: SizeInt;
begin
SetLength(Result, Count);
for i := 0 to High(Result) do
Result[i] := Random(MaxLongInt);
end;
procedure PopulateVector(const Data: TData);
var
Vector: TLongIntVector;
N: LongInt;
begin
Vector := TLongIntVector.Create;
try
Vector.Reserve(Length(Data));
for N in Data do
Vector.PushBack(N);
finally
Vector.Free;
end;
end;
procedure PopulateList(const Data: TData);
var
List: TLongIntList;
N: LongInt;
begin
List := TLongIntList.Create;
try
List.Capacity := Length(Data);
for N in Data do
List.Add(N);
finally
List.Free;
end;
end;
procedure PopulateArray(const Data: TData);
var
A: TLongIntArray;
i: SizeInt;
begin
A := TLongIntArray.Create;
SetLength(A, Length(Data));
for i := Low(Data) to High(Data) do
A[i] := Data[i]
end;
var
Count: LongInt = Round(1E6);
Data: TData;
begin
repeat
Count := Count * 3;
Data := GenData(Count);
Writeln('Populating ', Length(Data), ' keys...');
Measure(' Array ', @PopulateArray, Data);
Measure(' Vector ', @PopulateVector, Data);
Measure(' List ', @PopulateList, Data);
until Count >= MaxLongInt div 16;
WriteLn('End.');
ReadLn;
end.