exception performance
-
hallo leute
bin heute irgendwo in einem forum auf einen alten beitrag ueber exceptions gestossen wo der thread ersteller sich darueber auslies wie sagenhaft langsam exceptions in VC implementiert sind.
aus langeweile hab ich mir einen kleinen test geschrieben, der aus 3 teilen besteht. einmal ohne try - catch, einmal mit try - catch und einmal mit einem throw:
int func(int y) { int d = y*y/10; return d; } int main(void) { long long int res = 0; int u = 0; std::cout << "BEGIN" << std::endl; for(int i = 1;i < 1000000000;++i) /* !!! 1000.000.000 */ { res += func(i); } std::cout << "END: " << res << std::endl; std::cout << u << std::endl; }int func(int y) { int d = y*y/10; return d; } int main(void) { long long int res = 0; int u = 0; std::cout << "BEGIN" << std::endl; for(int i = 1;i < 1000000000;++i) /* !!! 1000.000.000 */ { try { res += func(i); } catch(int t) { ++u; } } std::cout << "END: " << res << std::endl; std::cout << u << std::endl; }int func(int y) { int d = y*y/10; if(d /2) throw d; return d; } int main(void) { long long int res = 0; int u = 0; std::cout << "BEGIN" << std::endl; for(int i = 1;i < 1000000000;++i) /* !!! NUR 1000.000 */ { try { res += func(i); } catch(int t) { ++u; } } std::cout << "END: " << res << std::endl; std::cout << u << std::endl; }beim 3. test hab ich nur noch 1.000.000 schleifendurchgaenge ausfuehren lassen. also 1/1000stel.
die zeiten:
- 2 sekunden
- 3 sekunden
- 7 sekunden
kompiliert unter VC 2010, release mode, 2.8 Ghz Amd
kann das sein das exceptions wirklich soviel zeit verbrauchen ?
oder hab ich da irgendeinen fehler drinnen ?Meep Meep
-
Klar. Die Frage ist: Inwiefern ist das ein Problem? Wenn exceptions am rumfliegen sind, dann sollte die Performance doch sowieso wurscht sein, sind ja eben Ausnahmen und nicht die Regel...
-
es geht nicht darum, ob die performance bei nem throw wurst is oder egal.
aus irgendeinem grund war ich der meinung das exceptions nicht so viel zeit in anspruch nehmen.Meep Meep
-
Kann sein, daß derzeit mit dem MSVC es ein wenig lahm ist.
Ist aber kein Problem, weil man sowas eh nicht macht.Für sicher halte ich, daß die Fehlerbehandlung mit Exceptions bei guter Compilerunterstützung (gcc kanns) schneller ist als die gleichwertige Fehlerbehandlung, wenn man sie in C machen würde. Mir wäre es wurstegal, ob MSVC es heute schon kann. In der nächsten oder übernächsten Version wird MS nachziehen. Also einfach drauflosmachen, es wird mit der Zeit nur besser.
-
Meep Meep schrieb:
aus irgendeinem grund war ich der meinung das exceptions nicht so viel zeit in anspruch nehmen.
Naja, du hast dir ja nun selbst bewiesen dass sie es unter Umständen doch tun

-
Hi
Das Beispiel zeigt eigentlich auch schön die durchgeführte bzw. fehlende Optimierung von MSVC (kann man im ASM-Output sehen
). Da deine ersten beiden Codes kein throw einsetzen, hat der Compiler den gesamten Exception-Overhead rausgeschmissen... der catch-Block wird nicht implementiert, weil der Compiler feststellen kann, dass er nie gebraucht wird.
Sobald aber irgend ein throw möglich sein könnte muss an allen möglichen Stellen ein Exception-Handler installiert und auch wieder deinstalliert werden - das produziert Code und braucht Zeit. Zusätzlich nutzt MSVC Structured Exception Handler des Betriebssystems, was weitere Optimierungen erschwert.Wie bereits erwähnt wurde, ist aber nicht gesagt, dass andere Compiler, die nicht wie MSVC arbeiten, deinen Code nicht wesentlich effizienter übersetzen können.
Wenn du den gleichen Code einmal statisch zusammenkompilierst und einmal in eine DLL verlagerst, verlierst du auch Ausführungsgeschwindigkeit, weils dann kein Inlining und andere Code-Optimierungen gibt. Ist also ganz normal
- ob das in der Praxis überhaupt auffällt, ist aber eine andere Fragelg
-
volkard schrieb:
Kann sein, daß derzeit mit dem MSVC es ein wenig lahm ist.
Ist aber kein Problem, weil man sowas eh nicht macht.Für sicher halte ich, daß die Fehlerbehandlung mit Exceptions bei guter Compilerunterstützung (gcc kanns) schneller ist als die gleichwertige Fehlerbehandlung, wenn man sie in C machen würde. Mir wäre es wurstegal, ob MSVC es heute schon kann. In der nächsten oder übernächsten Version wird MS nachziehen. Also einfach drauflosmachen, es wird mit der Zeit nur besser.
Also bei mir ist der gcc mit -O3 auch total lahm im letzten Beispiel.
-
GehZehZeh schrieb:
Also bei mir ist der gcc mit -O3 auch total lahm im letzten Beispiel.
Ach, ja.
gcc kann inzwischen catch kostenlos, wenn keine Exception fliegt. dafür zahlt man um so mehr, wenn doch eine fliegt. Hier hat er ja massenhaft welche geworfen. Klar, das darf teuer sein.
Sowas macht man ja auch nicht.
-
in dem Zusammenhang würde mich jetzt interessieren, ob die noexcept Spezifikation aus C++11 dem Compiler Optimierungpotenzial gibt. Ob der Compiler möglicherweise sogar so ein try-catch wegoptimiert, wenn nur noexcept Funktionen aufgerufen werden?
-
Eigentlich würde mich das reichlich wenig interessieren. Exceptions wirft man (wie bereits erwähnt) eh nur, wenn Performance völlig, aber wirklich völlig irrelevant ist. Und try-catch schreibt man sinnvollerweise auch nur, wenn man irgendetwas fangen will. Die sollen lieber andere Dinge optimieren.
