我被告知,在一个百万的for循环的例子中,添加一个try catch块会增加主要的性能成本,比没有它的速度慢1000倍。这是真的吗?
最好尽可能多地使用try catch块吗?
答案 0 :(得分:30)
来自MSDN site:
寻找和设计 异常繁重的代码可能导致a 体面的胜利。请记住这一点 这与try / catch无关 块:你只会产生成本 抛出实际异常。您 可以使用尽可能多的try / catch块 你要。使用例外 无偿的是你失败的地方 性能。例如,你应该 远离使用的东西 控制流程的例外。
答案 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)。
如果您使用的功能可能会让您做出选择。错误是否严重=>崩溃应用程序。该错误是否非关键且可能=>捕获它(并可能记录它)。