?:-Operator (Performancefrage)



  • Hallo Zusammen,

    Gibt es einen Unterschied bezüglich der Performance zwischen

    int a;
    if(...)a=1;else a=2;
    

    und folgendem Code?

    int a = ...?a:b;
    

    Auch wenn der Unterschied nur gering ist, würde ich gerne die schnellere Lösung nehmen, da oben gezeigter Code mehrere Tausend Mal Pro Sekunde ausgeführt wird.

    Vielen Dank schonmal für eure Antworten.



  • Hab noch einen Fehler entdeckt...

    Der Zweite Code muss natürlich so aussehen:

    int a = ...?1:2;
    


  • Das sollte der compiler auf den selben Maschinencode zusammen optimieren. Wenn du sicher gehen willst, vermeide bedingungen:

    if(a<b)
       a = 1;
    else
      a = 2;
    
    //zu:
    
    static const int arr[] = { 2, 1 };
    a = arr[a<b];
    

    Über den Sinn solcher Optimierungen lässt sich sicherlich streiten 😃



  • Die Varianten mit "if" und "?" sollten - guten Compiler vorausgesetzt - gleich schnell sein.
    Die Array-Variante kann schneller sein, kann aber auch langsamer sein. Kann auch gleich schnell sein. Muss man ausprobieren.
    Ich habe sowas schonmal eingesetzt, in meinem Fall war die Array-Variante merkbar (besser: messbar) schneller.



  • vielleicht sollte man noch hinzufuegen das nur der ?: operator in der meta programmierung eingesetzt werden kann. if-else nicht. da gibt es dann keine bedingung zur laufzeit.



  • a=1+(a>=b); ist natürlich am schnellsten.



  • volkard schrieb:

    a=1+(a>=b); ist natürlich am schnellsten.

    Das glaube ich nicht. Es sei denn, Du beweist mir das Gegenteil.



  • volkard schrieb:

    a=1+(a>=b); ist natürlich am schnellsten.

    Weil es natürlich immer die Wahl zwischen N und N+1 ist... Das war nur ein schlecht gewähltes Beispiel von ihm.



  • Hier noch ein Code, der bei beliebigen Zahlenpaaren funktioniert:

    int b,c;
    int a = b+(c-b)*<Bedingung>;
    

    Hier ist es natürlich fraglich, ob eine solche Implementierung sinvoll ist und ob diese Lösung auch noch schneller ist als der ?: - Operator. (Aufgrund der Arithmetischen Operationen ist er es wohl nicht.)

    MfG, Jochen


Anmelden zum Antworten