Hallo,
Ich habe mal etwas getestet, wie schnell denn die Programme sind und habe mal mit den 4!=24 möglichen Anordnungen von 1,2,3,4 experimentiert.
Bei falscher Sortierung, also <> 4,3,2,1 wird abgebrochen.
Die Ausgabe ist in CPU Takten.
Code:
Tests mit NetworkSort 2 1 1 2 4 4 3 3
24774777.28
Tests mit D4SortAphton 2 4 1 3 4 2 3 1
24774777.92
Tests mit D4SortByteArray 2 4 1 3 4 2 3 1
24774777.92
Tests mit Selectionsort3up 2 4 1 3 4 2 3 1
24774777.92
Tests mit D4SortByteArray2 Anzahl:10000000
137.92
Tests mit D4SortByteArray3 Anzahl:10000000
99.20
Tests mit Selectionsort Anzahl:10000000
86.08
Tests mit Selectionsort2 Anzahl:10000000
83.84
Tests mit Selectionsort3Down Anzahl:10000000
83.52
Tests mit Selectionsort4 Anzahl:10000000
83.52
Wie man sieht haben manche Proceduren ein erstes Problem mit der Folge 2,4,1,3, ist aber Zufall.
Selectionsort4 ist schon schnell.
Ich finde es merkwürdig, wenn irgendwo Laufzeiten in ms runterfallen und man keinen Bezug zur Anzahl der Durchläufe,Testwerte etc. hat.
Bei immer gleichen Werte betrügt ja die Sprungvorhersage.
Gruß Horst
P:S Die Werte variieren, je nachdem ob der Virenscanner/CPU-Wechsel oder sonstwas dazwischen funkt.
Delphi-Quellcode:
P$TESTVIER_SELECTIONSORT4$BYTEARRAY:
# Temps allocated between esp+0
and esp+0
#
Var A located
in register eax
#
Var T located
in register dl
# [146]
begin
# [148]
if A[0] > A[1]
then begin T:= A[0]; A[0]:= A[1]; A[1]:= T;
end;
movb (%eax),%
dl
cmpb 1(%eax),%
dl
jna .Lj435
movb 1(%eax),%cl
movb %cl,(%eax)
movb %
dl,1(%eax)
.Lj435:
# [149]
if A[0] > A[2]
then begin T:= A[0]; A[0]:= A[2]; A[2]:= T;
end;
movb (%eax),%cl
cmpb 2(%eax),%cl
jna .Lj443
movl %ecx,%edx
movb 2(%eax),%cl
movb %cl,(%eax)
movb %
dl,2(%eax)
.Lj443:
# [150]
if A[0] > A[3]
then begin T:= A[0]; A[0]:= A[3]; A[3]:= T;
end;
movb (%eax),%cl
cmpb 3(%eax),%cl
jna .Lj451
movl %ecx,%edx
movb 3(%eax),%cl
movb %cl,(%eax)
movb %
dl,3(%eax)
.Lj451:
# [151]
if A[1] > A[2]
then begin T:= A[1]; A[1]:= A[2]; A[2]:= T;
end;
movb 1(%eax),%cl
cmpb 2(%eax),%cl
jna .Lj459
movl %ecx,%edx
movb 2(%eax),%cl
movb %cl,1(%eax)
movb %
dl,2(%eax)
.Lj459:
# [152]
if A[1] > A[3]
then begin T:= A[1]; A[1]:= A[3]; A[3]:= T;
end;
movb 1(%eax),%cl
cmpb 3(%eax),%cl
jna .Lj467
movl %ecx,%edx
movb 3(%eax),%cl
movb %cl,1(%eax)
movb %
dl,3(%eax)
.Lj467:
# [153]
if A[2] > A[3]
then begin T:= A[2]; A[2]:= A[3]; A[3]:= T;
end;
movb 2(%eax),%cl
cmpb 3(%eax),%cl
jna .Lj475
movb 3(%eax),%
dl
movb %
dl,2(%eax)
movb %cl,3(%eax)
.Lj475:
# [155]
end;
ret