Einzelnen Beitrag anzeigen

Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#62

AW: Schnittmenge von mehreren Mengen ermitteln

  Alt 20. Mär 2012, 20:08
Hallo,

Da ich kein Unit diagnostics habe, ( Wo gibt es die für freepacal? ) habe ich ein workaround queryperformancecounter oder einfach time unter Linux genommen.

Der Aufruf der Assemblerversion sollte auch Intersect, hier Left, auf die richtige Länge setzen, damit Chancengleichheit herrscht und man den Fehler überhaupt erkennen kann.

Delphi-Quellcode:
procedure _Intersect59ASM(var Left: TSampleArray; const Right: TSampleArray);
var
  R: TSampleArray;
begin
  R := Right;
  //zuvor GetIntersect_5(Left, R, Length(Left))
  setlength(left,GetIntersect_5(Left, R, Length(Left)));
end;
Meine Prozedur hatte ich in #51 ja nicht explizit angegeben:
Delphi-Quellcode:
procedure Intersect51(var Left: TSampleArray; const Right: TSampleArray);
// modifiziertes Intersect45 auf while Schleife
type
{$PointerMath On}
  pData = ^tData; // hier ist tData Int64

var
  L, R, LeftEnd, RightEnd: pData;
  N: NativeInt;
begin
  N := 0;
  L := @Left[0];
  R := @Right[0];
  LeftEnd := @Left[Length(Left)];
  RightEnd := @Right[Length(Right)];

  if (L < LeftEnd) and (R < RightEnd) then
    repeat
      while (L < LeftEnd) and (R < RightEnd) AND (L^ = R^) do
      begin
        Left[N] := L^;
        Inc(N);
        inc(R);
        inc(L);
      end;
      if (L = LeftEnd) OR ( R = RightEnd) then
        Break;
     
      while (L < LeftEnd) AND (L^ < R^) do
        inc(L);
      while (R < RightEnd) AND (R^ < L^) do
        inc(R);
    until False;

  SetLength(Left, N);
{$PointerMath Off}  
end;
Meine Laufzeiten unter Linux mit freepascal 2.6.0 sind nun mit einem Phenom 955 X4 mit 3,2 Ghz:
Code:
  #61, Pascal 10000000
  #39, Pascal 10000000
  #51, Pascal 10000000
  #59, Assem   9999999

   Messung #61, Pascal #39, Pascal #51, Pascal #59, Assem
         1      138          134           76           62
         2      137          133           76           59
         3      137          134           77           59
         4      136          134           77           59
         5      137          134           76           59
         6      137          134           77           64
         7      137          133           77           58
         8      137          135           76           60
         9      138          134           76           59
        10      137          133           76           59
        11      137          134           76           59
Fertig.
Im angehängten Program habe ich als Gag es ein Define Laptop, um die Pause einzubauen.

Gruß Horst
Angehängte Dateien
Dateityp: pas Thema167053_5.dpr.pas (10,5 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat