为什么抛出异常这么慢?

0lu*_*sz0 2 .net performance exception internals

他们告诉我们不要使用异常来控制我们程序的流程,因为抛出异常很慢.我从来没有听到任何解释为什么抛出异常这么慢.

所以问题是:

抛出异常的机制是什么,涉及哪些特定操作可能会对性能产生影响?

编辑:

一些澄清:我想听听操作系统处理抛出异常所需的额外工作.在用户和内核模式之间是否有一些切换成本很高?或者构建异常对象可能代价高昂?或者也许有一些东西切换程序流程我错过了什么?我的问题是编程语言不可知(我希望如此,但证明我错了).但是,如果您需要一些锚点,那么我对与此主题相关的.NET内部结构感兴趣.

EDIT2:

我对异常性能没有任何问题.我只是想了解这种机制的内部结构.

EDIT3:

让我的问题更清楚.

sea*_*and 6

异常处理需要一些复杂性和"魔力".借调@Joni的回应,主要成本是收集堆栈跟踪.抛出异常时,运行时必须向下遍历堆栈的激活记录,寻找兼容的异常处理程序,最后执行finally阻止每一步.所有这些都必须在运行时发生; 它无法由编译器修复.在像C++这样的语言中,必须执行析构函数.

异常处理本质上是带外"特殊"处理模式.加速正常执行的事情(如缓存)也不起作用.(我想这里的参考地点要差很多).这种处理可以进行优化,但由于交叉处理应该是"特殊的",因此它的关注较少.