Nehmen wir an, das ursprüngliche Poster hatte eine Schleife, die wirklich optimiert werden sollte - jeder Befehl wurde gezählt. Wie können wir empirisch die Antwort auf seine Frage herausfinden?
GCC hat mindestens einen nützlichen, wenn nicht üblich verwendeten Schalter, '-S'. Es speichert die Assembly-Code-Version der .c-Datei und kann verwendet werden, um Fragen wie die OP-Posen zu beantworten. Ich schrieb ein einfaches Programm:
int main()
{
int sum = 0;
for(int i=1;i<=10;++i)
{
sum = sum + i;
}
return sum;
}
Und lief: gcc -O0 -std=c99 -S main.c
, die Assemblierung-Version des Hauptprogramms zu schaffen. Hier ist der Inhalt von main.s (mit einigen der Flaum entfernt):
movl $0, -8(%rbp)
movl $1, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
addl %eax, -8(%rbp)
addl $1, -4(%rbp)
.L2:
cmpl $10, -4(%rbp)
jle .L3
Sie brauchen nicht ein Montage Experte zu sein, um herauszufinden, was los ist. Movl verschiebt Werte, addl fügt Dinge hinzu, cmpl vergleicht und jle steht für 'springen wenn kleiner als', $ ist für Konstanten. Es lädt 0 in etwas - das muss "Summe" sein, 1 in etwas anderes - ah, "ich"! Ein Sprung zu L2, wo wir den Vergleich mit 10 machen, springe zu L3, um das Add zu machen. Gehe nochmal zu L2 um den Vergleich zu wiederholen. Ordentlich! Eine for-Schleife.
Ändern Sie das Programm:
int main()
{
int sum = 0;
int i=1;
for(;i<=10;++i)
{
sum = sum + i;
}
return sum;
}
Rerun gcc und die resultierende Anordnung wird sehr ähnlich sein. Es gibt einige Dinge, die mit der Aufzeichnung von Zeilennummern passieren, also werden sie nicht identisch sein, aber die Assembly ist die gleiche. Gleiches Ergebnis mit dem letzten Fall. Also, auch ohne Optimierung ist der Code ungefähr gleich.
Aus Spaß, führen Sie gcc mit '-O3' anstelle von '-O' erneut aus, um die Optimierung zu aktivieren und die .s-Datei anzuzeigen.
main:
movl $55, %eax
ret
gcc nicht nur herausgefunden wir ein for-Schleife wurden zu tun, aber auch klar, dass es war eine konstante Anzahl von Zeiten zu laufen hat die Schleife für uns bei der Kompilierung, rausgeschmissen ' ‚i‘ und ‚Summe‘ und hart die Antwort codiert - 55! Das ist SCHNELL - wenn auch ein bisschen künstlich.
Moral der Geschichte? Verbringen Sie Ihre Zeit damit, sicherzustellen, dass Ihr Code sauber und gut gestaltet ist. Code für Lesbarkeit und Wartbarkeit. Die Jungs, die von Mountain Dew und Cheetos leben, sind viel schlauer als wir und haben die meisten dieser einfachen Optimierungsprobleme für uns erledigt. Habe Spaß!
Diese Art von Frage ist ein wirklich schlechtes Zeichen ... –
+1 Um das zu fragen, nur so kann der Mythos debubed sein – Andres