可能重复:
‘try’的性能成本
有人告诉我,在一个包含一百万次循环的例子中,添加try catch块会使程序运行速度慢1000倍。这是真的吗?
使用尽可能多的try catch块难道不是最好的选择吗?
可能重复:
‘try’的性能成本
有人告诉我,在一个包含一百万次循环的例子中,添加try catch块会使程序运行速度慢1000倍。这是真的吗?
使用尽可能多的try catch块难道不是最好的选择吗?
我记得就在几天前似乎有一个类似的问题,但我找不到它了...
只是添加一个 try/catch 块通常不会明显改变性能,除非没有抛出异常,虽然它可能会防止方法被内联。 (不同版本的 CLR 在内联方面有不同的规则;我记不清楚细节了。)
真正的开销是在实际抛出异常时 - 即使这个开销通常是夸大的。如果你适当地使用异常(即仅在真正异常或意外错误情况下使用),那么除了在服务太过于混乱而无法被认为是“正常工作”之外,它们不太可能对性能造成重大影响。
至于是否应尽可能使用 try/catch 块 - 绝对不!通常只有在您实际可以处理异常时才应该捕获异常 - 这相当罕见。特别是,仅仅吞咽一个异常几乎总是错误的做法。
我编写的 try/finally 块比 try/catch 块要多得多(实际上几乎总是通过 using
语句)。在堆栈的顶层使用 Try/catch 有时是合适的,以便服务即使失败一个请求也可以继续处理下一个请求,但除此之外,我很少捕获异常。有时候值得捕获一个异常以将其包装在另一个异常中 - 基本上是翻译异常而不是真正处理它。
您绝对应该测试这样的声明(这很容易),但不,这不会伤害您(它会有成本,但不是1000倍)。
抛出异常并处理它们是昂贵的。使用try..catch..finally并不糟糕。
现在说到这一点,如果您要捕获异常,您需要计划如何处理它。如果您只是要重新抛出异常,则捕获异常没有意义,而且很多时候,如果出现异常,您无法做太多事情。
添加try catch块有助于控制您无法控制的异常。性能成本来自在存在其他替代方案时抛出异常。例如,为了退出例程而抛出异常而不是简单地从例程返回会导致大量开销,这可能完全是不必要的。
我被告知添加try catch块会导致性能成本大约比没有慢1000倍,例如在一百万次循环中。这是真的吗?
使用try catch确实会增加性能成本,但它并不是一个重大的性能成本。
最好尽可能地使用try catch块吗?
不是的,最好在有意义的情况下使用try catch块。
确实,异常是一项非常昂贵的操作。同时,try..catch块会使代码凌乱并且难以阅读。尽管如此,大多数时候,异常适合用于应该崩溃应用程序的错误。
我总是在所有异常上运行断点,所以一旦出现错误,它就会抛出,并且我可以相对容易地定位问题。如果每个人都一直抛出异常,那么程序性能就会变差,我无法使用所有异常断点,这让我很难过。
在我看来,不要将异常用于正常的程序事件(例如用户输入了一个非数字,而您尝试将其解析为数字)。对于这种情况,请使用正常的程序流控制结构(即if)。
如果您使用可能引发异常的函数,那么您需要作出选择。如果错误很关键,则崩溃应用程序。如果错误非关键且可能发生,则捕获它(并潜在地记录它)。