0lu*_*sz0 2 .net performance exception internals
他们告诉我们不要使用异常来控制我们程序的流程,因为抛出异常很慢.我从来没有听到任何解释为什么抛出异常这么慢.
所以问题是:
抛出异常的机制是什么,涉及哪些特定操作可能会对性能产生影响?
编辑:
一些澄清:我想听听操作系统处理抛出异常所需的额外工作.在用户和内核模式之间是否有一些切换成本很高?或者构建异常对象可能代价高昂?或者也许有一些东西切换程序流程我错过了什么?我的问题是编程语言不可知(我希望如此,但证明我错了).但是,如果您需要一些锚点,那么我对与此主题相关的.NET内部结构感兴趣.
EDIT2:
我对异常性能没有任何问题.我只是想了解这种机制的内部结构.
EDIT3:
让我的问题更清楚.
异常处理需要一些复杂性和"魔力".借调@Joni的回应,主要成本是收集堆栈跟踪.抛出异常时,运行时必须向下遍历堆栈的激活记录,寻找兼容的异常处理程序,最后执行finally阻止每一步.所有这些都必须在运行时发生; 它无法由编译器修复.在像C++这样的语言中,必须执行析构函数.
异常处理本质上是带外"特殊"处理模式.加速正常执行的事情(如缓存)也不起作用.(我想这里的参考地点要差很多).这种处理可以进行优化,但由于交叉处理应该是"特殊的",因此它的关注较少.