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?

64voto

Ryan Cavanaugh Punkte 204278

Die wahrscheinlichste Erklärung für die Frage ist, dass der Interviewer denkt, dass der Prozessor die einzelnen Bits der Zahlen überprüft, eins nach dem anderen, bis er auf einen Wert ungleich null stößt:

1 = 00000001
2 = 00000010

Wenn der "ist null?" Algorithmus von der rechten Seite der Zahl ausgeht und jedes Bit überprüfen muss, bis es auf ein Bit ungleich null trifft, müsste die while(1) { } Schleife doppelt so viele Bits pro Iteration überprüfen wie die while(2) { } Schleife.

Dies erfordert ein sehr falsches mentales Modell davon, wie Computer funktionieren, aber es hat eine interne Logik. Eine Möglichkeit zu überprüfen wäre zu fragen, ob while(-1) { } oder while(3) { } genauso schnell wären, oder ob while(32) { } sogar langsamer wäre.

35voto

Tõnu Samuel Punkte 2698

Natürlich kenne ich nicht die wirklichen Absichten dieses Managers, aber ich schlage einen völlig anderen Blickwinkel vor: Wenn man ein neues Mitglied in ein Team aufnimmt, ist es nützlich zu wissen, wie er auf Konfliktsituationen reagiert.

Sie haben dich in einen Konflikt geführt. Wenn das wahr ist, sind sie clever und die Frage war gut. Für einige Branchen, wie zum Beispiel das Bankwesen, könnte das Posten Ihres Problems auf Stack Overflow ein Grund für eine Ablehnung sein.

Aber natürlich weiß ich es nicht, ich schlage nur eine Möglichkeit vor.

28voto

OldFrank Punkte 888

Ich denke, der Hinweis ist in "gefragt von einem leitenden Manager" zu finden. Diese Person hat offensichtlich aufgehört zu programmieren, als sie Manager wurde, und dann hat es ihm/ihr mehrere Jahre gedauert, um leitender Manager zu werden. Hat nie das Interesse am Programmieren verloren, aber seit damals nie mehr eine Zeile geschrieben. Also bezieht sich sein Verweis nicht auf "irgendeinen anständigen Compiler da draußen", wie einige Antworten erwähnen, sondern auf "den Compiler, mit dem diese Person vor 20-30 Jahren gearbeitet hat".

Zu dieser Zeit haben Programmierer einen beträchtlichen Teil ihrer Zeit damit verbracht, verschiedene Methoden auszuprobieren, um ihren Code schneller und effizienter zu machen, da die CPU-Zeit des 'Zentralminicomputers' so wertvoll war. Das haben auch Leute gemacht, die Compiler geschrieben haben. Ich vermute, dass der einzige Compiler, den sein Unternehmen zu dieser Zeit zur Verfügung gestellt hat, auf der Grundlage von 'häufig vorkommenden Anweisungen, die optimiert werden können' optimiert hat und bei einem while(1) eine Abkürzung genommen hat und alles andere ausgewertet hat, einschließlich eines while(2). Eine solche Erfahrung könnte seine Position und sein Selbstvertrauen erklären.

Der beste Ansatz, um eingestellt zu werden, ist wahrscheinlich einer, der es dem leitenden Manager ermöglicht, sich 2-3 Minuten zu "den guten alten Zeiten des Programmierens" hinreißen zu lassen, bevor SIE ihn geschickt zum nächsten Interviewthema führen. (Gutes Timing ist hier wichtig - zu schnell und Sie unterbrechen die Geschichte - zu langsam und Sie werden als jemand mit unzureichender Konzentration bezeichnet). Teilen Sie ihm am Ende des Interviews mit, dass Sie sehr daran interessiert wären, mehr über dieses Thema zu erfahren.

22voto

Rad'Val Punkte 8535

Du hättest ihn fragen sollen, wie er zu diesem Schluss gekommen ist. Unter jedem anständigen Compiler da draußen kompilieren die beiden zu denselben asm-Anweisungen. Also hätte er dir auch den Compiler nennen sollen, um anzufangen. Selbst dann müsstest du den Compiler und die Plattform sehr gut kennen, um auch nur eine theoretische Vermutung anzustellen. Und letztendlich ist es in der Praxis nicht wirklich wichtig, da es andere externe Faktoren wie Speicherfragmentierung oder Systemlast gibt, die die Schleife mehr beeinflussen als dieses Detail.

20voto

ouah Punkte 138337

Zu diesem Frage, sollte ich hinzufügen, dass ich mich daran erinnern, dass Doug Gwyn vom C-Komitee geschrieben hat, dass einige frühe C-Compiler ohne den Optimizer-Pass einen Test in der Assembly für while(1) generieren würden (im Vergleich zu for(;;), welches das nicht hätte).

Ich würde dem Interviewer antworten, indem ich diese historische Notiz geben würde und dann sagen würde, dass obwohl ich sehr überrascht wäre, wenn ein Compiler das tun würde, ein Compiler hätte könnte:

  • ohne den Optimizer-Pass den Test sowohl für while(1) als auch für while(2) generieren
  • mit dem Optimizer-Pass wird dem Compiler angewiesen, alle while(1) zu optimieren (mit einem bedingungslosen Sprung), weil sie als idiomatisch betrachtet werden. Dadurch würde das while(2) mit einem Test bleiben und daher einen Leistungsunterschied zwischen den beiden erzeugen.

Natürlich würde ich dem Interviewer hinzufügen, dass das Nicht-Betrachten von while(1) und while(2) als das gleiche Konstrukt ein Zeichen von schlechter Optimierung ist, da diese äquivalente Konstrukte sind.

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