2014-04-21 19 views
5

In den Folge beiden Code-Snippets, gibt es tatsächlich verschiedene jede entsprechend der Geschwindigkeit der Erstellung oder Laufen?Wird sofort fortgesetzt?

for (int i = 0; i < 50; i++) 
{ 
    if (i % 3 == 0) 
     continue; 

    printf("Yay"); 
} 

und

for (int i = 0; i < 50; i++) 
{ 
    if (i % 3 != 0) 
     printf("Yay"); 
} 

, persönlich in den Situationen, in denen es viel mehr als eine print-Anweisung ist, ich war die erste Methode verwendet die Menge der Einbuchtung für den Code enthält, zu reduzieren, . Ich habe mich eine Zeitlang gewundert, also habe ich mich gefragt, ob es tatsächlich eine andere Wirkung als visuell hat.

Antwort Alf (i in den Kommentaren nicht Code bekommen konnte arbeiten ...)

Präzisere meiner Nutzung ist etwas entlang der Linien von einer „handleObjectMovement“ Funktion, die

for each object 
    if object position is static 
     continue 

    deal with velocity and jazz 
umfassen würde

mit im Vergleich

for each object 
    if object position is not static 
     deal with velocity and jazz 

daher nicht Rückkehr mit mir. Im Wesentlichen „zu dieser Iteration, wenn es nicht relevant ist, bewegen sich auf“

+0

Ich denke, Umgang mit trivialen Fällen oder Fehler Fällen zuerst in einer Funktion, mit 'return' zu ** Kaution **, ist in Ordnung. "Fortsetzen" bedeutet jedoch, dass der Leser des Codes zusätzliche Analyse verwenden muss. Denken Sie daran, dass der Quellcode schreiben, ist nicht etwa an den Compiler zu kommunizieren, was es tun sollte, so viel wie die Kommunikation zu anderen oder Ihr später selbst, was Ihre * Absicht * ist. –

+3

Ein guter Compiler sollte die äquivalente Quelle in denselben Assemblercode optimieren. Ob das tatsächlich passiert, hängt von zu vielen Dingen ab, die man im Voraus sicher wissen muss. Warum überprüfen Sie es nicht einfach selbst? Untersuchen Sie die generierte Baugruppe und/oder messen Sie die Zeiten und Sie erhalten Ihre Antwort. –

+0

Zwei Gründe Branko, das erste ist schlecht, aber das zweite, das ich fühle, ist ziemlich gut: P 1) Ich bin faul 2) Es ist nützlich, diese Art von Fragen nur ein Google weg zu haben. Jetzt hat jemand, der sich wundert, dass er eine SO-Seite hat, zu der er gehen kann. – Randomman159

Antwort

8

Das Verhalten ist das gleiche, so dass die Laufzeitgeschwindigkeit sollte gleich sein, es sei denn der Compiler tut etwas dumm (oder es sei denn, Sie deaktivieren Optimierung).

Es ist unmöglich zu sagen, ob ein Unterschied in der Übersetzungsgeschwindigkeit gibt es, da es auf die Details der davon abhängt, wie der Compiler analysiert, analysiert und übersetzt die zwei Varianten.

Wenn die Geschwindigkeit wichtig ist, es messen.

1

Wie wäre es völlig der Kontrolle loszuwerden?

for (int t = 0; t < 33; t++) 
{ 
    int i = t + (t >> 1) + 1; 

    printf("%d\n", i); 
} 
+1

Ich glaube, er war wirklich über das Compiler-Verhalten nicht gefragt, dieser bestimmte Code – gbtimmon

+1

^Wie gesagt gbtimmon. – Randomman159

+1

Sie wären dennoch überrascht, wie viele Verwendungen von continue durch das Schreiben von intelligentem Code entfernt werden können. Haben Sie ein anderes, komplizierteres Beispiel? – fredoverflow