try / catch块的性能成本

时间:2010-08-13 19:31:30

标签: c# .net asp.net

  

可能重复:
  Performance Cost Of ‘try’

我被告知,在一个百万的for循环的例子中,添加一个try catch块会增加主要的性能成本,比没有它的速度慢1000倍。这是真的吗?

最好尽可能多地使用try catch块吗?

7 个答案:

答案 0 :(得分:30)

来自MSDN site

  

寻找和设计   异常繁重的代码可能导致a   体面的胜利。请记住这一点   这与try / catch无关   块:你只会产生成本   抛出实际异常。您   可以使用尽可能多的try / catch块   你要。使用例外   无偿的是你失败的地方   性能。例如,你应该   远离使用的东西   控制流程的例外。

另请参阅以下相关的SO问题:(1) (2) (3)(4)

答案 1 :(得分:10)

我可以发誓几天前就有这样的问题了,但我找不到......

只是添加try / catch块不太可能在不抛出异常时显着改变性能,尽管可能阻止方法被内联。 (不同的CLR版本对内联有不同的规则;我不记得细节。)

真实的费用是指实际抛出异常的时候 - 甚至这笔费用通常都是夸大其词。如果您正确使用异常(即仅在真正异常或意外的错误情况下),那么它们不太可能成为重大的性能损失,除非您的服务太过于无法被认为是“正常工作”

至于你是否应该尽可能多地使用try / catch块 - 绝对不行!如果你真的可以处理它,你通常应该只捕获一个例外 - 这是相对罕见的。特别是,只是吞下一个异常几乎总是错误的事情。

我写了更多try / finally块(有效 - 几乎总是通过using语句)而不是try / catch块。 Try / catch有时适用于堆栈的顶层,因此即使一个请求失败,服务也可以继续处理下一个请求,否则我很少捕获异常。有时值得捕获一个异常,以便将它包装在一个不同的异常中 - 基本上是翻译异常而不是真正处理异常。

答案 2 :(得分:2)

你绝对应该测试这样的声明(很容易),但不,这不会伤害你(它会有成本,但不是1000次)。

抛出异常并处理它们很昂贵。试试看......最后也不错。

现在有了这样说,如果你要捕捉异常,你需要制定一个计划,用它来做它。如果你只是要重新抛出,那就没有意义了,很多时候,如果你得到一个例外,那么你就无能为力。

答案 3 :(得分:1)

添加try catch块有助于从您无法控制的异常中控制您的应用程序。性能成本来自于在有其他替代方案时抛出异常。例如,抛出异常来保存例程而不是简单地从例程返回会导致大量的开销,这可能是完全没有必要的。

答案 4 :(得分:0)

  

我被告知要加一试   catch block增加了主要性能   成本大约慢1000倍   而不是,在一个for的例子中   一百万的循环。这是真的?

使用try catch会增加性能成本,但这不是主要的性能成本。

  

使用try catch块是不是最好   尽可能多?

不,最好在有意义时使用try catch块。

答案 5 :(得分:0)

为什么要考虑性能成本,何时可以进行基准测试并确定其是否重要?

答案 6 :(得分:0)

异常是非常昂贵的操作。也试试..catch块使代码混乱并使其难以阅读。也就是说,异常适用于大多数时候应该使应用程序崩溃的错误。

我总是在所有异常中运行中断,所以一旦发生错误就会抛出,我可以很容易地找到它。如果每个人都在抛出异常,我会遇到不好的表现而我不能在所有例外情况下使用休息时间,这让我很难过。

IMO不会对正常的程序事件使用异常(例如非数字中的用户类型,并尝试将其解析为数字)。使用正常的程序流构造(即if)。

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