was ist schneller?

7

Wenn wir die folgenden 2 Codefragmente in C ++ haben, die die gleiche Aufgabe ausführen:

%Vor%

oder

%Vor%

Ich weiß nicht viel über Computerarchitektur / C ++ Design, aber ich denke, dass der erste Code schneller ist, weil er die ganze Zahl am Anfang deklariert und sie nur in der while-Schleife verwendet, und im zweiten Code die Integer a wird jedes Mal deklariert, wenn die While-Schleife neu gestartet wird. Kann jemand mir dabei helfen, bin ich richtig oder was und warum?

    
VaioIsBorn 30.03.2010, 15:18
quelle

8 Antworten

11

Die int-Deklaration ist Information für den Compiler und übersetzt nicht in eine Anweisung, die codiert werden muss. Es macht also keinen Unterschied. Wenn der int in der Schleife deklariert wird, wird die Schleife nicht nach unten verschoben. Warum nicht versuchen, beides für sich selbst zu kompilieren und den Compiler dazu zu bringen, Assemblercode auszugeben, damit Sie selbst sehen können.

    
Nick Moore 30.03.2010, 15:23
quelle
14

Es sollte keinen Unterschied geben, aber um extra empirisch zu sein (anal?) Ich habe das mit g ++ getestet, indem ich eine Funktion für jeden der Code-Snippets erstellt habe. Sowohl mit als auch ohne Optimierung hat es identischen Code generiert, unabhängig davon, wo sich die Deklaration int a befindet.

%Vor%

Dies ist die nicht optimierte Schleife:

%Vor%

und das Optimierte:

%Vor%     
Jakob Borg 30.03.2010 15:29
quelle
5

Ernsthaft, ist es wirklich wichtig? Dies ist der Typ der Mikrooptimierungen, den Sie vermeiden sollten. Schreibe den Code, der besser lesbar ist, welcher IMHO die zweite Schleife ist. Der Compiler ist gut genug, um die Optimierung für diese Art von Dingen zu tun, und ich würde es tun, um das zu tun.

    
Naveen 30.03.2010 15:25
quelle
2

Es gibt keine "schneller" im C ++ - Standard, außer für Leistungsgarantien in der Standardbibliothek. Ein optimierender Compiler würde wahrscheinlich a eliminieren, da er nicht verwendet wird. Alternativ könnte es den gesamten Speicher, den die Funktion für alle lokalen Variablen benötigt, auf einmal zuweisen, und dann würde es auch keinen Unterschied machen.

Die einzige legitime Frage zu Low-Level-Sprachkonstrukten wie dieser lautet, ob Ihre spezielle Implementierung sie schneller oder langsamer ausführt. Der beste Weg, sie herauszufinden, besteht darin, die Zeit selbst zu bestimmen. Sie werden feststellen, dass viele dieser Dinge einfach keine Rolle spielen, und wenn Sie den generierten Code untersuchen, werden Sie oft feststellen, dass Compiler dasselbe mit verschiedenen Arten des Code-Schreibens tun.

Normalerweise ist die Suche nach Mikrooptimierungen eine schlechte Idee, aber wenn Sie versuchen, einen allgemeinen Stil einzurichten, kann es sich lohnen (zum Beispiel ++i anstatt i++ ). Wenn Sie jedoch einen Stil für einen anderen Zweck als die Lesbarkeit einrichten, sollten Sie gute Gründe dafür haben. In diesem Fall bedeutet das Testen auf Leistung.

    
David Thornley 30.03.2010 15:26
quelle
1

Nein, es kann nicht in der Schleife deklariert werden, wie es zur Kompilierungszeit deklariert ist. Ich würde sagen, dass sie gleich sind, aber der zweite wäre vielleicht schneller gewesen, wenn der Typ der Variablen etwas komplizierter wäre und Konstruktor und Destruktor hätte.

    
Michael Krelin - hacker 30.03.2010 15:22
quelle
1

Theoretisch könnte die erste Option schneller sein. In der Praxis würde ich erwarten, dass a und b so in Register eingetragen werden, dass die generierte Assembly identisch ist (was Sie in der kompilierten Binärdatei verifizieren können). Wenn Sie die Schleife oft genug ausführen, dass Sie denken, dass es einen Unterschied gibt, ist die einzige Möglichkeit zu wissen, zu messen. Wenn Ihr Profiler keinen Unterschied erkennen kann, schreiben Sie ihn so, dass der Code für zukünftige Betreuer am klarsten ist.

Im Allgemeinen (wie bereits erwähnt) bieten diese Arten von Optimierungen keinerlei sinnvolle Verbesserung der Programmleistung. Sie sollten stattdessen nach algorithmischen und Designoptimierungen suchen.

    
Mark B 30.03.2010 15:29
quelle
0

Ich glaube nicht, dass es in der Praxis einen Unterschied geben würde. Es sind keine Speicherzuordnungen beteiligt, da der Speicher für automatische Variablen zur Kompilierzeit reserviert oder reserviert wird.

Theoretisch denke ich, dass die zweite auch einfach schneller sein könnte: Der Compiler hat mehr Informationen darüber, wo und wie die Variablen verwendet werden (z. B. können Sie die gleiche Variable für etwas verwenden, das später völlig unabhängig ist).

Sie könnten sich über solche Dinge Sorgen machen, wenn Sie mit Typen arbeiten, deren Konstruktion teuer ist. ZB sollte ich einen std :: vector in der inneren Schleife deklarieren, oder sollte ich es vor der Schleife deklarieren und clear() it am Anfang des Schleifenkörpers (den zugewiesenen Speicher wiederverwenden).

    
UncleBens 30.03.2010 16:00
quelle
-6

Der erste sollte schneller sein; Allerdings ist der Compiler in der Regel schlau genug, um dies selbst zu optimieren, was wahrscheinlich keine Rolle spielt.

Aus Gründen der Reinheit ist die Antwort jedoch die erste

EDIT: Es ist schneller, weil es nur eine Zuweisung im Gegensatz zu N erfordert (N ist die Anzahl der Iterationen, die die while-Schleife ausführt).

    
Chris 30.03.2010 15:19
quelle

Tags und Links