try / catch块的性能成本

可能重复:
‘尝试’的性能成本

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

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

来自MSDN网站 :

找到并设计出exception繁重的代码可以带来不错的性能。 请记住,这与try / catch块无关:只有在抛出实际exception时才会产生成本。 您可以根据需要使用尽可能多的try / catch块。 无偿使用例外是您失去性能的地方。 例如,您应该远离使用控制流exception之类的事情。

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

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

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

真正的费用是实际抛出exception – 甚至这种费用通常都是夸大其词。 如果您恰当地使用例外(即仅在真正exception或意外的错误情况下),那么它们不太可能成为显着的性能损失,除非您的服务太过于无法被认为是“正常工作”。

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

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

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

抛出exception并处理它们是昂贵的。 试试看……最后也不错。

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

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

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

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

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

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

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

确实,exception是非常昂贵的操作。 另外try..catch块使代码混乱并使其难以阅读。 这表示exception适用于大多数情况下应该使应用程序崩溃的错误。

我总是在所有exception中运行中断,因此一旦发生错误,它就会抛出,我可以很容易地找到它。 如果每个人都在抛出exception而我总是表现糟糕而且我不能在所有例外情况下使用rest时间,这让我感到难过。

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

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