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