关于c#:try / catch块的性能成本

Performance cost of a try/catch block

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Performance Cost Of ‘try’

有人告诉我,在一百万个for循环的例子中,添加一个try-catch块会比不添加块慢1000倍,从而增加主要的性能成本。这是真的吗?

尽可能多地使用try catch块不是最好的方法吗?


来自MSDN站点:

Finding and designing away
exception-heavy code can result in a
decent perf win. Bear in mind that
this has nothing to do with try/catch
blocks: you only incur the cost when
the actual exception is thrown. You
can use as many try/catch blocks as
you want. Using exceptions
gratuitously is where you lose
performance. For example, you should
stay away from things like using
exceptions for control flow.

另请参阅这些相关的SO问题:(1)(2)(3)和(4)。


我可以发誓几天前有个这样的问题,但我找不到…

只添加一个try/catch块不太可能在不引发异常的情况下显著地改变性能,尽管它可能会阻止方法被内联。(不同的clr版本在内联方面有不同的规则;我记不清细节。)

真正的开销是当一个异常被抛出时——甚至那个开销通常都被夸大了。如果您适当地使用异常(即仅在真正的异常或意外的错误情况下),那么它们不太可能会对性能造成重大影响,除非您的服务太主机化,无论如何都不能被视为"工作"。

至于您是否应该尽可能多地使用try/catch块-绝对不是!通常,只有当您能够真正处理异常时,才应该捕获它——这是相对罕见的。尤其是,吞下一个例外几乎总是错误的。

我编写的try/finally块(实际上几乎总是通过using语句)比try/catch块多得多。Try/Catch有时在堆栈的顶层是合适的,这样即使一个请求失败了,服务也可以继续处理下一个请求,否则我很少捕获异常。有时,捕获一个异常以将其包装为另一个异常是值得的——基本上是转换异常,而不是真正处理它。


你应该明确地测试这样的声明(足够简单),但不,这不会伤害你(这会有代价,但不是1000次)。

抛出异常并处理它们是昂贵的。试一试……接住……最后还不错。

有了这句话,如果你想抓住一个例外,你需要有一个计划,你要用它来做什么。如果你只是想再次脱身,就没有抓住的意义,而且很多时候,如果你遇到了例外,你就没什么能做的了。


添加Try-Catch块有助于控制应用程序不受您无法控制的异常的影响。性能成本来自于当有其他选择时抛出一个异常。例如,抛出一个异常以摆脱例程而不是简单地从例程返回会导致大量开销,这可能是完全不必要的。


确实,例外是一个非常昂贵的操作。还可以尝试..catch块使代码混乱,使代码难以读取。对于大多数情况下会使应用程序崩溃的错误,上述异常是可以接受的。

我总是在所有异常上运行中断,所以一旦发生错误,它就会抛出,我可以相当容易地确定它。如果每个人都在不断地抛出异常,我的表现很糟糕,我不能在所有异常上使用中断,这让我很难过。

IMO不会对正常程序事件使用异常(比如用户输入非数字,并试图将其解析为数字)。为此使用普通程序流构造(即if)。

如果您使用的函数可能会使您做出选择。错误是否严重=>应用程序崩溃。错误是否非关键,并且可能=>捕获它(并可能记录它)。


为什么要猜测性能成本,当你可以进行基准测试,看看它是否重要?


I am being told that adding a try
catch block adds major performance
cost in the order of 1000 times slower
than without, in the example of a for
loop of a million. Is this true?

使用Try-Catch会增加性能成本,但这不是主要的性能成本。

Isn't it best to use try catch block
as much as possible?

不,最好在有意义的时候使用Try-Catch块。