15 Stimmen

Kosten für das Auslösen von C++0x-Ausnahmen

Welche Auswirkungen hat das Auslösen von Ausnahmen in C++0x auf die Leistung? Inwieweit ist dies compilerabhängig? Dies ist nicht dasselbe wie die Frage Wie hoch sind die Kosten für die Eintragung einer try Block, auch wenn keine Ausnahme ausgelöst wird .

Sollten wir erwarten, dass wir Ausnahmen mehr für die allgemeine logische Handhabung wie in Java verwenden?

22 Stimmen

Sie sollten keine Ausnahmen für die allgemeine Logikbehandlung in Java verwenden.

8 Stimmen

@Bill: s/in Java/EVER/ Sie werden nicht umsonst "Ausnahmen" genannt; sie sind außergewöhnlich.

0 Stimmen

@Pesto: Ich stimme zu, aber ich sprach mehr über die Tatsache, dass der OP zu denken schien, es sei gängige Praxis in Java speziell.

4voto

Nikolai Fetissov Punkte 79627

Ich glaube nicht, dass C++0x irgendetwas an der Funktionsweise von C++-Ausnahmen hinzufügt oder ändert. Für den allgemeinen Ratschlag schauen Sie bitte nach aquí .

2voto

rlbond Punkte 62333

Man kann sich vorstellen, dass sie ungefähr die gleiche Leistung wie in C++03 haben, die "sehr langsam" ist! Und nein, Ausnahmen sollten aufgrund des try-catch-throw-Konstrukts in jeder Sprache nur in Ausnahmefällen verwendet werden. Sie machen etwas falsch, wenn Sie throw zur Programmflusskontrolle in Java verwenden.

6 Stimmen

Für Werte von "sehr langsam!" annähernd 1ms auf meinem Laptop und C++-Compiler. Wenn das in Ihrer innersten Schleife ist, ist das natürlich ein Problem. Ich denke, der Grund, keine Ausnahmen für Nicht-Fehler-Situationen zu verwenden, ist, dass es den Kontrollfluss Ihres Codes schwieriger zu verfolgen macht, nicht FUD über die Leistung.

0 Stimmen

@onebyone - es ist kein FUD über die Leistung, die Leistungseinbußen sind real und sehr signifikant, und Ausnahmen richten bei Echtzeitanwendungen verheerenden Schaden an.

5 Stimmen

Es ist FUD, wenn man sagt, die Kosten für Ausnahmen seien "sehr hoch", ohne zu wissen, um wie viel Prozent eine tatsächliche Anwendung langsamer läuft, wenn man sie verwendet. Manchmal ist es signifikant, normalerweise nicht. Und man kann nicht "es würde eine Echtzeitanwendung kaputt machen" als Grund verwenden, um ein bestimmtes Sprachfeature nicht zu verwenden, da (a) fast alle Anwendungen nicht in Echtzeit laufen und (b) fast alle Sprachfeatures eine Echtzeitanwendung kaputt machen könnten, indem sie es unmöglich machen, Cache-Misses und ähnliches vorherzusagen.

0voto

Jason Punkte 41

@Steve Jessop hat die De-facto-Antwort gepostet, aber ich denke, es gibt noch eine weitere Sache: verschiedene Optimierungsstufen wie "-O2" auszuprobieren, die oft von den meisten Produkten verwendet wird.

-2voto

Cătălin Pitiș Punkte 13785

Die Behandlung von Ausnahmen ist im Allgemeinen eine kostspielige Funktion, da beim Auslösen/Auffangen zusätzlicher Code ausgeführt werden muss, um das Abwickeln des Stapels und die Auswertung der Auffangbedingungen sicherzustellen.

Soweit ich das aus der Lektüre verstanden habe, gibt es z. B. bei Visual C++ einige ziemlich komplexe Strukturen und Logik, die in den Code eingebettet sind, um dies zu gewährleisten. Da die meisten Funktionen andere Funktionen aufrufen, die Ausnahmen auslösen können, kann auch in diesen Fällen ein gewisser Overhead für das Abwickeln des Stacks entstehen.

Bevor man sich jedoch Gedanken über den Ausnahme-Overhead macht, ist es am besten, wenn man Maßnahme die Auswirkungen der Verwendung von Ausnahmen in Ihrem Code vor jeder Optimierungsmaßnahme. Die Vermeidung einer übermäßigen Nutzung von Ausnahmen sollte erhebliche Overheads bei der Behandlung von Ausnahmen verhindern.

4 Stimmen

Ist Ihnen klar, dass der Stapel noch abgewickelt werden muss, wenn Sie normal zurückkehren?

2 Stimmen

Ausnahmen sind im Grunde frei, während es keine Ausnahme propogating die zusätzlichen Kosten bei der Platzierung try catch Blöcke ist bestenfalls vernachlässigbar. Die Rückabwicklung aufgrund einer Ausnahme kostet zwar mehr, aber nicht mehr, als wenn man den Code zur Rückgabe von Fehlercodes schreibt. Die Aussage, dass es teuer ist, ist also völlig falsch.

-2voto

MSN Punkte 51308

Stellen Sie sich vor, eine Glocke ertönt, der Computer nimmt keine Daten mehr an tout Eingabe drei Sekunden lang, und dann tritt jemand dem Benutzer gegen den Kopf.

Das sind die Kosten für eine Ausnahme. Wenn dadurch ein Datenverlust oder ein Brand des Rechners verhindert wird, sind sie die Kosten wert. Andernfalls ist es das wahrscheinlich nicht.

EDIT: Und da dies ein downvote (plus ein upvote, so +8 für mich!), werde ich die oben mit weniger Humor und mehr Informationen zu klären: Ausnahme, zumindest in C ++ Land, erfordern RTTI und Compiler und möglicherweise Betriebssystem Magie, die die Leistung von ihnen ein riesiges schwarzes Loch der Unsicherheit macht. (Es ist nicht einmal garantiert, dass sie ausgelöst werden, aber diese Fälle treten bei anderen, ernsthafteren Ereignissen auf, wie z.B. wenn der Speicher knapp wird oder der Benutzer den Prozess einfach beendet oder der Rechner tatsächlich Feuer fängt). Wenn Sie sie also verwenden, dann nur, um sich von einer Situation zu erholen, in der sonst etwas Schreckliches passieren würde, aber diese Erholung darf nicht mit der Erwartung verbunden sein, dass sie performant abläuft (was immer das für Ihre spezielle Anwendung sein mag).

Wenn Sie also Ausnahmen verwenden, können Sie nichts über die Auswirkungen auf die Leistung annehmen.

6 Stimmen

Wie? Ausnahmen bedürfen weder der Magie des Betriebssystems noch der Magie des Compilers. Sie werden gut verstanden. Keine Garantie, dass sie ausgelöst werden? Tut mir leid, aber das ist schlichtweg falsch. Ausnahmen können für die Verwaltung von Fehlern und unerwarteten Bedingungen äußerst nützlich sein, ebenso wie für die Erstellung von wartungsfreundlicherem Code durch die Trennung von normalen Pfaden und Fehlerpfaden. Man kann einfach nicht sagen, dass sie fast nie die Kosten wert sind. Nicht alle Anwendungen erfordern eine hohe Leistung oder Echtzeitleistung, und häufig ist die Leistung egal, wenn sich Ihr Programm in einem Fehlerzustand befindet.

0 Stimmen

Wenn ich mir die Seitenfehler pro Sekunde auf meinem Rechner ansehe, bin ich sehr besorgt, dass jemand eines Tages die Antwort von Earlz ("Unterbrechungen mit Ausnahmen emuliert") und Ihre ("Ausnahmen treten den Benutzer vor den Kopf") kombinieren könnte.

0 Stimmen

IN C++ können Sie nicht immer garantieren, dass eine bestimmte Ausnahme ausgelöst wird. Wenn Sie z. B. eine Ausnahme auslösen und Ihnen der Stapelplatz oder der Speicher für die Zuweisung der Ausnahme ausgeht, passieren schlimme Dinge. Auf einer höheren Ebene ist dies keine Aussage über die Nützlichkeit von Ausnahmen; es ist eine Aussage über die Auswirkungen auf die Leistung, wenn Sie sich dafür interessieren. Was Sie nicht tun sollten. Das ist mein Punkt.

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