【发布时间】:2009-07-02 23:12:19
【问题描述】:
基本上,问题是: C# 中的异常对性能影响很大吗?避免异常重新抛出是否更好?如果我在代码中生成异常,会影响性能吗?
对于问题本身的愚蠢感到抱歉
【问题讨论】:
标签: c# exception-handling
基本上,问题是: C# 中的异常对性能影响很大吗?避免异常重新抛出是否更好?如果我在代码中生成异常,会影响性能吗?
对于问题本身的愚蠢感到抱歉
【问题讨论】:
标签: c# exception-handling
如果您担心异常性能,则说明您使用错误。
但是是的,异常确实会影响性能。
【讨论】:
在 C# 中引发异常是一项代价高昂的操作(与 C# 中的其他操作相比),但还不足以让我避免这样做。
我同意 Jared 的观点,如果您的应用程序由于引发和抛出异常而明显变慢,我会看看您的整体策略。可以重构某些东西以使异常处理更有效,而不是摒弃在代码中引发异常的概念。
【讨论】:
Microsoft 的类库开发设计指南是非常有价值的资源。这是一篇相关文章:
我还推荐微软出版社的Framework Design Guidelines 书。它有很多来自设计指南链接的信息,但它是由 MS 人员和 Anders Hejlsberg 本人注释的。它让我们深入了解事物的“为什么”和“如何”。
【讨论】:
通过 try/catch 语句运行代码根本不会影响性能。如果抛出异常,唯一的性能损失是......因为运行时必须展开堆栈并收集其他信息才能填充异常对象。
【讨论】:
大多数人所说的,加上:
不要将异常用作编程流程的一部分。换句话说,不要为account.withdrawalAmount > account.balance 之类的东西抛出异常。那是一个商业案例。
另一个需要注意的性能问题是吞咽异常。这是一个滑坡,一旦你开始允许你的应用程序吞下异常,你就开始在任何地方都这样做。现在,您可能会允许您的应用抛出您不知道的异常,因为您正在吞噬它们,您的性能会受到影响并且您不知道为什么。
【讨论】:
这并不傻,只是我在 SO 上的其他地方也看到过。
当事情真的很异常时,异常就会很好地发生。大多数情况下,当您没有太多机会从中恢复时,您会重新抛出异常(可能在记录之后)。所以它不应该打扰你正常的程序执行过程。
【讨论】:
Exceptions 顾名思义就是例外。因此,您不能期望它们成为优化的重要目标。更多情况下,他们表现不佳,因为他们有其他优先事项,例如收集有关问题的详细信息。
【讨论】:
.NET 中的异常确实会影响性能。这就是为什么它们应该只在例外情况下使用的原因。
【讨论】: