2010-08-17 11 views
5

Mögliche Duplizieren:
while (1) Vs. for (;;) Is there a speed difference?Beste Endlosschleife

Hallo,

Was ist besser, schneller und optimierte Art und Weise Endlosschleife zu implementieren - für (;;) oder während (1)? und warum?

+11

Ist eine optimierte Endlosschleife kein Oxymoron? –

+4

Ernsthaft?Sehen Sie sich die Compiler-Ausgabe an. –

+0

Genaues Duplikat http://StackOverflow.com/Questions/885908/while-1-vs-for-there-a-Speed-Difference/ –

Antwort

16

In jedem normalen Compiler sollte es keinen Unterschied geben. Zum Beispiel, hier ist was LLVM-clang erzeugt (mit -O3 Flag) für while (1) {}:

.file "test.c" 
    .text 
    .globl main 
    .align 16, 0x90 
    .type main,@function 
main: 
    pushl %ebp 
    movl %esp, %ebp 
    .align 16, 0x90 
.LBB0_1: 
    jmp .LBB0_1 

Notiere die jmp .LBB0_1 Teil, der die tatsächliche Endlosschleife ist. Für die for (;;) Art erzeugt es absolut den gleichen Code.

Sie können auch mit anderen Compilern zum Spaß versuchen, aber es ist am besten, nur keine Sorgen mehr darüber zu machen.


OK, ich hatte genauso gut mit gcc versuchen:

.file "test.c" 
    .text 
.globl main 
    .type main, @function 
main: 
    pushl %ebp 
    movl %esp, %ebp 
.L2: 
    jmp .L2 
+0

Ya Ich probierte auch while (1) und for (;;) mit gcc und habe keinen Unterschied. – iSegFault

+0

+1 für die Verwendung von Clang anstelle von GCC. –

45

Ich bevorzuge for(;;) weil es nichts testet und semantisch das ist was du meinst. Es macht nicht viel Sinn, weiter zu testen, wenn 1 wahr ist. Jedoch sollte jeder professionelle C-Programmierer beide Idiome sofort erkennen, da beide verwendet werden.

In Bezug auf die tatsächliche Leistung sollte es keinen Unterschied geben. Der Compiler wird den Test optimieren.

Ich habe versucht, beide zu testen, welche schneller ist, aber keiner von ihnen ist noch nicht abgeschlossen.

+20

Vielleicht ein bisschen länger warten ...? – FrustratedWithFormsDesigner

+0

Behalten Sie das im Auge und lassen Sie es uns wissen. ;) –

+0

bester Kommentar aller =) – Molske

4

Ich würde behaupten, nicht mehr und optimiert wird, da weder die Aufgabe von looping stufenlos in jede messbare Menge an Zeit zu erreichen.

Ist es wirklich möglich, die Unendlichkeit mehr oder weniger effizient zu erreichen?

+6

Wahre Tatsache: Jon Skeet kann eine Endlosschleife in dreieinhalb Sekunden flach ausführen. –

+0

@mmyers: Ich dachte, das war Chuck Norris? – FrustratedWithFormsDesigner

+1

... und durch Entfernen einer einzelnen Codezeile kann er optimiert werden, um in 0 Sekunden zu laufen. –

0

Das ist meine Meinung (keine Forschung getan):

Wenn Debugging-Code, wie ich durch sie Schritt für for-Schleifen es mich auf alle drei Teile zum ersten Mal gehen macht, dann zwei der Rest der Iterationen. Die while-Schleife hat jedoch nur einen. Nur ein Gedanke.

0

Selbe Sache. Compiler übersetzt es in einen einzigen JMP-Befehl.

2

In der Theorie könnte ein vollständig naiven Compiler das Literal '1' in der Binärdatei (verschwenden Raum) speichern und überprüfen, ob 1 == 0 jede Iteration (verschwenden Zeit und mehr Platz).

In der Realität jedoch, auch mit "Nein" -Optimierungen, Compiler werden immer noch auf beide reduzieren. Sie können auch Warnungen ausgeben, da dies einen logischen Fehler anzeigen könnte. Zum Beispiel könnte das Argument von while anderswo definiert werden und man merkt nicht, dass es konstant ist.