Code Optimierung



  • Habe hier zwei code zeilen welche jeweils das selbe machen:

    //A
    ((bMask >> i) & 1) ? ++bStats[i] : --bStats[i];
    //B
    bStats[i]+= ((bMask >> i) & 1) ? 1 : -1;
    

    wieso ist B schneller als A?



  • weil der compiler schlecht ist... oder weil er geschmack hat. Variante A ist ein if in ?: gequetscht. Ein echtes if wäre IMHO besser als A oder B.



  • in variante B ist auch ein if drin...

    d.h. hier ist A schneller als B ?

    //A
    if(x)
      c=a;
    else
      c=b;
    //B
    c= x ? a : b;
    


  • nein. die beiden sollte dein compiler absolut identisch übersetzen.

    DrGreenthumb wollte dir wohl eher sagen: die variante mit dem if ist normalerweise besser lesbar als die mit dem trinären operator.

    warum dein compiler in dem top-post unterschiedlichen code erzeugt, ist eine sehr interessante frage. müsste man mal den erzeugten assemblercode sehen, um das erklären zu können. eigentlich könnte er für beide varianten den gleichen code erzeugen. aber vllt rafft er eine der beiden konstruktionen auch einfach nicht richtig.

    von welchem typ sind die daten in bStats?



  • BYTE bStats[8];
    

  • Mod

    Typischer Fall von Optimierung an der falschen Stelle. Optimierung beginnt im Großen und endet im Kleinen. In diesem Falle etwa indiziert das i, dass wir uns in einer Schleife befinden. Dann dürfte es weitaus effizienter sein, diese zu vektorisieren. Davon abgesehen sind +1/-1 keine guten Alternativen. Besser wäre

    if ( (bMask >> i) & 1 )
         ++bStats[i];
    

    Zum Schluss einfach bStats[i] verdoppeln und die Gesamtzahl aller Tests abziehen.



  • bStats[i]+=((bMask >> i) & 1 )*2-1
    

Log in to reply