最近在网上找了一下,针对C++,下表看性能影响不是很大,关键在于对exception的基类的定义,建议都从std::exception开始
w/o EH | w/EH | % | |
---|---|---|---|
Borland | 78 sec | 83 sec | 6% |
Microsoft | 83 sec | 87 sec | 5% |
Symantec | 94 sec | 96 sec | 4% |
针对.net 的CLR,一个声明的exception只是在protect region里面增加了一条记录,相应的在byte code外增加了一些代码,一旦exception被throw出来,就会被CLR直到相应的区域去处理,不会影响太多的性能。finally的部分也需要增加一块,但编译器可以静态的确定着这部分代码是一定要执行的,因此可以直接JIT,所以也不会影响性能。
根据exception的特性,如果没有相应的处理,则会被转给上一级去查找,这里可能会存在性能问题,在于写程序的时候对exception的处理,如果没有在本地及时处理的话,就看函数一级一级pop stack的overhead了。 另外一个影响性能的地方在于,在try ... catch 之间的代码,不会被编译器优化,所以需要很小心。
总的来说,exception handle还是一项非常有用的特性,对性能没有很大影响,可以帮助人们在编译阶段住处程序中需要的异常处理从而减少runtime的异常