Ist inline-Assembler schnell ?
-
Hallo,
ich habe gerade mal einen Speedtest gemacht. Inline-Assembler gegen C++
Ich habe folgenden Code 100.000.000 mal durchlaufen lassen :Inline Assembler :
char var1 = 3, var2=4,var3; for(int i = 0;i<100000000;i++) { _asm { mov eax,var1 xchg eax,var2 mov var1,eax } }
C++
char var1 = 3, var2=4,var3; for(int i = 0;i<100000000;i++) { var3 = var1; var1 = var2; var2 = var3; }
Als ergenbnis bekomme ich ungefähr für Asm 8000 Ms und für C++ 500 Ms heraus. Liegt das daran, dass ich C++ Bibliotheken (iostream,ctime) inkludiere ? Oder an was liegt es, dass der Code in C++ schneller ist als der in Asm =
-
Das liegt daran, dass der C++ Compiler den C++ Code gut optimieren kann, den ASM Code weniger gut (bzw. oft garnicht, weil er sich denkt: du wirst schon wissen was du tust).
Schau dir mal den generierten ASM Code an. uU ist die gesamte Schleife wegoptimiert oder soetwas.
-
Hallo,
ich habe letztens auch einen Speed-Test gemacht. Ergebnis: konnte drei Nächte lang nicht schlafen.
Mal im ernst: bevor man sich den Kopf über Speed zerbricht sollte man erstmal festlegen, *was* man überhaupt messen möchte.
Die Frage ob inline-Assembler schnell ist, ist sinnlos. Schnell im Vergleich zu was? Und vorallem lässt sich sowas auch nicht durch *einen* Test der *eine* folge von Befehlen testet beantwortet.
Interessanter wäre es da schon, wenn du ein spezifisches Problem hättest und du dort dann vergleichst ob es sich lohnt, bestimmte Stellen in inline-Assembler zu programmieren.In diesem Fall könnte dir Volkard z.B. eine ganze Menge erzählen.
-
imson schrieb:
Inline Assembler :
char var1 = 3, var2 = 4, var3; for(int i = 0; i<100000000; i++) { _asm { mov eax,var1 xchg eax,var2 mov var1,eax } }
Eigentlich dürfte das gar nicht funktionieren, denn eax ist dword (32-Bit) und var1, var2, var3 sind byte (8-Bit).
Welchen Compiler verwendest du?Moritz
-
sorry, hab den code aus dem gedächtnis heraus abgetippt. Die Variablen liegen als int vor.
-
xchg eax,var2
irgendwie kein wunder, dass das lahm ist
schau am besten noch mal ins handbuch. im übrigen hat der rest hier nat. auch so recht.
-
Ob Inline-Assembler besser ist, hängt davon ab, ob du oder der Compiler besser Assembler kann.
-
Faustregel für (gute) Compiler: Der Compiler ist besser als du, es sei denn:
(a) Es gibt eine (superfixe) Anweisung, für die es keine Entsprechung im C++ gibt
(b) Du handoptimierst für eine vom Compiler nicht unterstützte PlatformIn deinem Beispiel: xchg ist nicht grad der schnellste Assembler-Befehl, und bei
mov eax, var1 mov ebx, var2 mov var1, ebx mov var2, eax
lassen sich die befehle auch viel besser paaren.