.NET异常和性能

时间:2011-12-06 10:01:50

标签: .net

已知异常的产生会降低性能

但我找不到这个

的原因

为什么异常的产生会降低性能?

3 个答案:

答案 0 :(得分:1)

嗯,因为它做了些什么。做任何事都需要时间。

抛出异常会创建一个对象,获取堆栈的副本,​​最多两次遍历堆栈,并且可能跨域进行编组。做事需要时间。在一个理想的世界中,它也将是一个未被预测为被占用的分支(因为它应该是不太可能的分支),尽管我不知道这是不是这样的情况。它也特别容易导致高速缓存被重新填充的情况,因为控制已移动到远处的某个地方"。

尽管如此,异常并不是特别慢,除非在调试器中运行(出于显而易见的原因,当抛出异常时,异常会再次起作用)。它足够慢,在循环中进行try-and-catch,其中进行try-try-try或tryparse-and-report更有意义是一个坏主意,但这些属于良好的微观优化类别( "微优化"经常被用作诽谤,但是当语义更清晰的方法也稍微更高效时,那么它是一件好事,因为它的清晰度 - &#&# 39;当我们为了几个循环而使事情变得不那么清晰和语义合理时,微观优化会变成负面的。

答案 1 :(得分:0)

影响异常抛出成本的一个因素是具有调用堆栈信息的非常有用的Exception对象。这需要花费一些时间和内存空间来构建并为我们保留这些简洁的信息。例如,非托管C ++没有这样的信息性调用堆栈,因此在C ++中调试更复杂的任务。

答案 2 :(得分:0)

“如果您遇到异常严重影响性能的问题,那么除了性能之外,您在使用异常方面存在问题。” - Jon Skeet

换句话说,如果你将它们用于它们的目的,那就是特殊情况而不是常规控制流,抛出异常的性能损失应该不是问题。