Vorsicht mit Vorurteilen.
TEqualityComparer<T>.Default liefert dir eine Instant eines TEqualityComparer<T>, welche nur einmal erzeugt werden muss. (Die Kosten dafür an
RTTI etc sind also irrelevant)
EMBT wird sich Mühe gegeben haben, um die jeweilige Implementierung, die sich TEqualityComparer<T> anhand des T pickt ordentlich zu optimieren.
Wenn man aber einen ganz kleinen Test schreibt, der ihn gegen einen einfachen Integer-Vergleich antreten lässt, würde man erwarten, dass der Code gleich viiieel langsamer wird, right?
Denkste!
Zitat:
call1 took 294 ms
call2 took 146 ms
Ich glaube du kannst dir den Stress getrost sparen...
Ändere die Integers zu Strings und es sieht noch entspannter aus:
Zitat:
call1 took 1082 ms
call2 took 947 ms
(Optimierungen in den Compiler Settings ausschalten, nicht dass er den ganzen Vergleich wegoptmiert
)
Delphi-Quellcode:
uses
SysUtils,
Diagnostics,
Generics.Collections,
Generics.Defaults;
function Test(callback : TProc) : TStopwatch;
var
stopWatch : TStopwatch;
begin
stopWatch := TStopwatch.StartNew();
try
callback();
finally
stopWatch.Stop();
end;
exit(stopWatch);
end;
const
sampleSize = 10000000;
var
call1, call2 : TStopwatch;
list1, list2 : TList<Integer>;
procedure FillTestData;
var
i : Integer;
begin
list1.Capacity := sampleSize;
list2.Capacity := sampleSize;
for i := 0 to sampleSize do
begin
list1.Add(Random(i * 10));
list2.Add(Random(i * 100));
end;
end;
begin
list1 := TList<Integer>.Create();
try
list2 := TList<Integer>.Create();
try
FillTestData();
call1 := Test(procedure
var
i : Integer;
dummy : Boolean;
begin
for i := 0 to sampleSize do
dummy := TEqualityComparer<Integer>.Default.Equals(list1[i], list2[i]);
end);
call2 := Test(procedure
var
i : Integer;
dummy : Boolean;
begin
for i := 0 to sampleSize do
dummy := list1[i] = list2[i];
end);
finally
list2.Free();
end;
finally
list1.Free();
end;
WriteLn('call1 took ', Trunc(call1.Elapsed.TotalMilliseconds), ' ms');
WriteLn('call2 took ', Trunc(call2.Elapsed.TotalMilliseconds), ' ms');
end.