2010-07-04 9 views
5

Irgendwo habe ich gelesen, dass moderne Intel-Prozessoren für Low-Level-Hardware haben Ausnahmen umzusetzen und die meisten Compiler nutzen es, um den Effekt, dass Ausnahmen schneller werden als Ergebnisse Zustand zurückkehrt Variablen.C++ Rückgabewert im Vergleich Ausnahme Performance

Ist es wahr? sind Ausnahmen schneller als Variablen, soweit sie den Status zurückgeben/auf den Zustand reagieren? Ein Überlauf des Stacks über das Thema scheint dem zu widersprechen.

Danke

Antwort

11

Ich weiß nicht, wo Sie diese Zeilen lesen, aber es ist sicherlich falsch. Kein Hardwaredesigner würde außergewöhnliche Umstände schaffen, die per Definition ungewöhnlich sind und SCHNELLER als normale arbeiten. Beachten Sie auch, dass C, das laut TIOBE die beliebteste Systemsprache ist, nicht einmal Ausnahmen unterstützt. Es erscheint EXTREM unwahrscheinlich, dass Prozessoren für die Ausnahmebehandlung einer Sprache optimiert sind, deren Implementierung unter Compilern nicht standardisiert ist.

Auch wenn irgendwie Ausnahmen schneller waren, sollen Sie dennoch nicht außerhalb ihres beabsichtigten Zwecks nutzen sie, damit Sie jeden anderen Programmierer in der Welt zu verwirren.

4

Nein. Nichts wird schneller sein, als eine Variable in ein Register zu stecken. Auch bei expliziter Hardware-Unterstützung werden Ausnahmen immer noch Dinge wie Speicherzugriffe erfordern.

C++ Ausnahmen können nicht zum größten Teil auf diese Weise implementiert werden, weil C++ erfordert, dass der Stapel sein abgewickelt und Objekte zerstört.

14

Beachten Sie, dass es Unklarheiten in dem Begriff „Exception-Handler.“ Ich glaube, Sie werden feststellen, dass Hardware-Leute finden, wenn man über Ausnahmen reden bedeutet Dinge wie:

  1. Hardware-Interrupts, auch bekannt als Signale, deren Handler werden manchmal Exception-Handler genannt (siehe http://pages.cs.wisc.edu/~smoler/x86text/lect.notes/interrupts.html)
  2. Maschinenprüf- Ausnahmen, die das halt Computer, wenn etwas in der Hardware schief geht (siehe http://en.wikipedia.org/wiki/Machine_Check_Exception)

Keine von beiden hat etwas mit C++ Exception Handling Facility zu tun. Als Gegenbeispiel habe ich mindestens einen anekdotischen Datenpunkt, wo Ausnahmen viel langsamer waren als Return-Codes: das war auf Intel-Hardware in Ordnung, aber mit gcc 2.95 und einem sehr großen Code-Set mit einer sehr großen Ausnahmetabelle, Das wurde beim ersten Mal erstellt, als eine Ausnahme ausgelöst wurde. Nachfolgende Ausnahmen waren schnell, aber bis dahin wurde der Schaden in der Regel behoben. Zugegeben, gcc 2.95 ist ziemlich alt, aber es sollte ausreichen, um Sie davor zu warnen, Verallgemeinerungen über die Geschwindigkeit der C++ - Exception-Behandlung zu machen, sogar auf Intel-Hardware.

0

Selbst wenn sie schneller waren, sollten Sie sie nicht für etwas anderes verwenden als Ausnahmebedingungen. Wenn Sie sie missbrauchen, machen Sie Ihr Programm viel schwieriger zu debuggen. In gdb können Sie einen "Fangwurf" machen und leicht herausfinden, wo Ihr Programm schief läuft und eine Ausnahme auslösen, aber nicht, wenn Sie Ausnahmen als Teil Ihrer normalen Verarbeitung auslösen.

2

Die Antwort ist technisch korrekt, aber sehr irreführend.

Im Kern des Problems ist die Beobachtung, dass Ausnahmen außergewöhnlich sind. Sie passieren normalerweise nicht. Dies ist nicht der Fall, wenn Sie einen Fehlercode zurückgeben. Dies geschieht immer, auch wenn kein Fehler vorliegt.In diesem Fall hat die Funktion noch 0 zurückzukehren, oder true oder -1 oder ...

Nun bedeutet dies, dass eine CPU und ein Compiler speziell Funktionen optimieren können, die durch Ausnahme fehlschlagen. Aber es ist wichtig zu realisieren, was sie optimieren, und das ist die Nicht-Fehler, kein Ausnahmefall - auf Kosten der Ausnahmefälle.

Sobald wir das realisieren, können wir uns ansehen, wie der Compiler und die CPU solche Fälle optimieren. Eine übliche Methode besteht darin, den Ausnahmecode vom normalen Code zu trennen. Daher wird dieser Code normalerweise nicht im CPU-Cache landen, der als Ergebnis mehr nützlichen Code enthalten kann. Tatsächlich wird der Ausnahmecode möglicherweise nicht im RAM gespeichert und verbleibt auf der Festplatte.

Ein weiterer unterstützender Mechanismus ist der CPU-Verzweigungsprädiktor. Es wird daran erinnert, dass die Verzweigungen, die zu Ausnahmecode führen, normalerweise nicht genommen werden und daher voraussagen, dass sie auch das nächste Mal nicht genommen werden. Der Compiler kann dies sogar als Hinweis angeben. Dieses Hinweismerkmal wurde jedoch nach dem Intel Pentium 4 aufgegeben; moderne CPUs sagten Zweige gut genug voraus.

0

Ihre Frage ist ein wenig unklar, weil das, was meinen Sie mit Umsetzung Ausnahmen umfasst drei Dinge:

  • Eingabe eines try Block. Diese kann haben keine Kosten, aber neigt dazu, eine throw teurer zu machen. Es gibt a more specific question about this on SO.
  • Ausführen eines throw. Es gibt a more specific question about this on SO.
  • Abwickeln des Stapels, um von einem throw zu seinem catch zu gelangen, und Laden des Fehlerbehandlungscodes (in catch) in den CPU-Cache. Sie sollten diese Kosten ignorieren, da Sie diese Kosten bezahlen müssen, wenn Sie Statuscodes anstelle von Ausnahmen verwenden.
Verwandte Themen