Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#15

AW: "Quelltextbausteine" ähnlich include-Dateien gegen Codedopplung

  Alt 31. Aug 2012, 15:01
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”

Geändert von Elvis (31. Aug 2012 um 15:03 Uhr)
  Mit Zitat antworten Zitat