Sagen Sie, ich habe eine Schleife, die so aussieht:
%Vor%wobei eine triviale Aufgabe hinter einer if-Anweisung steckt, die nur wenige Male ausgeführt wird. Ich habe immer gehört, dass "wenn-Anweisungen in Schleifen langsam sind!" Also, in der Hoffnung auf (marginal) gesteigerte Performance, habe ich die Schleifen aufgeteilt in:
%Vor%Wird gcc (mit den entsprechenden Flags, wie -O3) automatisch die eine Schleife in zwei Teile aufteilen, oder wird es nur entrollen, um die Anzahl der Iterationen zu verringern?
Warum zerlegen Sie nicht einfach das Programm und sehen Sie selbst? Aber hier gehen wir. Dies ist das Testprogramm:
%Vor%und das ist der interessante Teil des disassemblierten Codes, der mit gcc 4.3.3 und -o3 kompiliert wurde:
%Vor%Wie wir sehen, ist es für dieses Beispiel nicht zutreffend. Wir haben nur eine Schleife, die bei main + 32 beginnt und bei main + 85 endet. Wenn Sie Probleme beim Lesen des Assembler-Codes ecx = i haben; ebx = Summe.
Aber Ihre Meilenzahl kann variieren - wer weiß, welche Heuristiken für diesen speziellen Fall verwendet werden, so müssen Sie den Code, den Sie im Kopf haben, kompilieren und sehen, wie sich längere / kompliziertere Berechnungen auf den Optimierer auswirken.
Obwohl der Verzweigungs-Prädiktor auf jeder modernen CPU ziemlich gut mit einem solchen einfachen Code zurechtkommt, werden Sie in beiden Fällen kaum Leistungsverluste sehen. Was ist der Leistungsverlust von vielleicht ein paar Fehleinschätzungen, wenn Ihr rechenintensiver Code Milliarden von Zyklen benötigt?
Tags und Links optimization c gcc unroll