616 Stimmen

Welches ist schneller: while(1) oder while(2)?

Dies war eine Interviewfrage eines leitenden Managers.

Was ist schneller?

while(1) {
    // Einige Code
}

oder

while(2) {
    // Einige Code
}

Ich sagte, dass beide die gleiche Ausführungsgeschwindigkeit haben, da der Ausdruck innerhalb des while-Statements schließlich zu true oder false ausgewertet werden sollte. In diesem Fall evaluieren beide zu true und es gibt keine zusätzlichen bedingten Anweisungen innerhalb der while-Bedingung. Daher werden beide mit der gleichen Ausführungsgeschwindigkeit ausgeführt, und ich bevorzuge while (1).

Aber der Interviewer sagte zuversichtlich: "Überprüfe deine Grundlagen. while(1) ist schneller als while(2)." (Er testete nicht meine Zuversicht)

Ist das wahr?

Siehe auch: Ist "for(;;)" schneller als "while (TRUE)"? Wenn nicht, warum verwenden Menschen es?

4voto

gnasher729 Punkte 49452

Hier ist ein Problem: Wenn Sie tatsächlich ein Programm schreiben und seine Geschwindigkeit messen, könnte die Geschwindigkeit der beiden Schleifen unterschiedlich sein! Für einen vernünftigen Vergleich:

unsigned long i = 0;
while (1) { if (++i == 1000000000) break; }

unsigned long i = 0;
while (2) { if (++i == 1000000000) break; }

mit einigem hinzugefügten Code, der die Zeit ausdruckt, könnte ein zufälliger Effekt wie die Positionierung der Schleife innerhalb einer oder zwei Cache-Lines einen Unterschied machen. Eine Schleife könnte rein zufällig vollständig innerhalb einer Cache-Line liegen, oder am Anfang einer Cache-Line, oder sie könnte zwei Cache-Lines überspannen. Und als Ergebnis könnte das, was auch immer der Interviewer behauptet, am schnellsten zu sein, tatsächlich am schnellsten sein - durch Zufall.

Schlimmstenfalls: Ein optimierender Compiler versteht nicht, was die Schleife tut, aber stellt fest, dass die Werte, die bei der Ausführung der zweiten Schleife erzeugt werden, die gleichen sind wie die, die von der ersten erzeugt werden. Und generiert vollen Code für die erste Schleife, aber nicht für die zweite.

4voto

Peter Wooster Punkte 5932

Früher habe ich in C und Assembler programmiert, als dieser Unsinn noch einen Unterschied hätte machen können. Wenn es tatsächlich einen Unterschied gemacht hat, haben wir es in Assembler geschrieben.

Wenn mich jemand diese Frage gestellt hätte, hätte ich wahrscheinlich Donald Knuths berühmtes Zitat von 1974 über vorzeitige Optimierung wiederholt und wäre gegangen, wenn das Interviewer nicht gelacht und weitergemacht hätte.

3voto

Nikolay Ivanchev Punkte 144

Sie sind beide gleich - dasselbe.

Gemäß den Spezifikationen gilt alles, was nicht 0 ist, als wahr, also auch ohne jegliche Optimierung, und ein guter Compiler wird keinen Code für while(1) oder while(2) generieren. Der Compiler würde lediglich eine einfache Überprüfung auf != 0 generieren.

3voto

ekerner Punkte 5354

Wenn man sich die Menge an Zeit und Mühe ansieht, die die Leute darauf verwendet haben, diese sehr einfache Frage zu testen, zu beweisen und zu beantworten, würde ich sagen, dass beide sehr langsam gemacht wurden, indem sie die Frage gestellt haben.

Und um noch mehr Zeit damit zu verbringen...

while (2) ist lächerlich, denn,

while (1) und while (true) werden historisch verwendet, um eine endlose Schleife zu erzeugen, bei der davon ausgegangen wird, dass break zu einem Zeitpunkt innerhalb der Schleife aufgrund einer Bedingung aufgerufen wird, die mit Sicherheit eintreten wird.

Die 1 ist einfach nur da, um immer wahr auszuwerten und daher ist es genauso albern, zu sagen while (2) wie zu sagen while (1 + 1 == 2), was auch wahr ausgewertet wird.

Und wenn du wirklich albern sein möchtest, benutze einfach: -

while (1 + 5 - 2 - (1 * 3) == 0.5 - 4 + ((9 * 2) / 4.0)) {
    if (succeed())
        break;
}

Ich denke, der Interviewer hat einen Tippfehler gemacht, der die Ausführung des Codes nicht beeinflusst hat, aber wenn er absichtlich die 2 benutzt hat, um seltsam zu sein, dann entlasse ihn, bevor er seltsame Aussagen in deinen Code einfügt, die das Lesen und Arbeiten damit erschweren.

2voto

user143522 Punkte 49

Das hängt vom Compiler ab.

Wenn es den Code optimiert, oder wenn es die 1 und 2 als wahr mit der gleichen Anzahl von Anweisungen für einen bestimmten Befehlssatz auswertet, wird die Ausführungsgeschwindigkeit gleich sein.

In realen Fällen wird es immer gleich schnell sein, aber es wäre möglich, sich einen bestimmten Compiler und ein bestimmtes System vorzustellen, bei dem dies anders bewertet werden würde.

Ich meine: Das ist eigentlich keine Frage, die mit der Sprache (C) zusammenhängt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X