Hallo,
so eine Erkältung macht wohl wirr...
In Beitrag #26 habe ich die Assemblerausgabe angehängt gehabt, aua, da kann ja niemand etwas mit anfangen.
@Bjoerk:
Warum funktioneren die Assembler Varianten bei Dir nicht?
Nach etwas suchen, habe ich es gefunden.
Weil du eine Klasse von TList genommen hast und dort auch die Funktionen definiert hast.
Code:
Var A located in register edx
# Var $self located in register eax !
Jetzt sind alle Assembler-Versionen davon ausgegangen, dass der Zeiger auf A in EAX steht, jetzt wird aber innerhalb der Klasse "self" in EAX übergeben.
Scheinbar habe ich falsch herum sortiert, ein BSWAP beseitigt das auf die Schnelle.
Wie himitsu schon angedeutet hat, kann man durch ganz andere Dinge die Performance so verschlechtern, das eine geschickte Sortierung völlig untergeht.
Wenn networkSort2 2236,67 ms für 1e8 Elemente/LongInt braucht sind dass 4*1e2/2,23667 = 178 MByte/s also noch gerade so schneller als eine heutige Festplatte.
miT tList statt eines einfachen Feldes sind die Zeiten sowieso egal.
Für 1e7 Werte ergab sich:
Code:
Erstellen der Werte: 1459 ms
DummySort: 188 ms
Selectionsort: 625 ms
Networksort: 601 ms
SelectionsortASM: 342 ms
SelectionsortASM2: 346 ms
SelectionsortASM2Horst: 328 ms
SelectionsortASM3Horst: 267 ms
Drücken Sie eine beliebige Taste . . .
Wenn der Zugriff auf die Daten schon DummySort: 188 ms dauert , geht der Rest darin unter.
SelectionsortASM3Horst: 267 ms-188 ms = 79 ms für das Sortieren.
Gruß Horst
P.S.
In Testvier halte ich die Datenmenge mit 32767 Elementen recht klein, es werden eben entsprechend viele Runden gemacht.
Ein dynamisches Array hätte 380 MByte gebraucht.
Das Anlegen einer Liste von 1e8 Werten braucht 2 GB an Platz und ist etwas zeitaufwändig.
Code:
Erstellen der Werte: 14684 ms
DummySort: 1828 ms
Selectionsort: 6188 ms
Networksort: 5994 ms
SelectionsortASM: 3425 ms
SelectionsortASM2: 3428 ms
SelectionsortASM2Horst: 3172 ms
SelectionsortASM3Horst: 2627 ms