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.


  • Mod

    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 Platform

    In 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.


Anmelden zum Antworten