异常代码对 C++ 性能的影响? [关闭]

Posted

技术标签:

【中文标题】异常代码对 C++ 性能的影响? [关闭]【英文标题】:C++ performance impact of code with exception? [closed] 【发布时间】:2013-02-24 07:46:38 【问题描述】:

如果我们删除所有带有错误返回值的 try-catch 的异常处理代码,代码执行会不会有持续的性能提升或 % 性能提升?

是否有很好的文章/参考资料可以解释第一次投掷、try-catch 的成本以及后续投掷、try-catch 块的成本?

这个问题的目的不是要找到一个阈值,在这个阈值上人们可能会针对异常进行错误返回样式的编码。我们都知道这很混乱。 (更快但很混乱)。

我希望量化 try-catch 的成本及其对 w.r.t 的影响。 0 对 1 的 try-catch 块和 1 对 n 的 try catch 块。

【问题讨论】:

"如果我们删除所有带有错误返回值的 try-catch 的异常处理代码," - 那么您将获得一张代码地狱的免费门票! 不要担心过早的微优化。如果您不使用 try/catch 进行程序控制流,则不会有问题。另外,先进行基准测试。 没有关于性能的假设性。只有通过剖析获得的事实和数据。 @OP 将其视为 ***.com/questions/1018800/… 的副本是否公平? 还有这个相关问题:***.com/questions/43253/… 【参考方案1】:

这完全取决于编译器和 ABI -- 没有一个答案。

即使您不投掷,它们也可能会产生少量成本。例如,setjmp/longjmp 实现由 VC++ 使用。一般来说,这是一个难以察觉的微不足道的成本,但它仍然存在。

也可能出现零成本异常——也就是说,它们在您抛出之前都是免费的。这对于正确使用异常的代码通常更好(保持它们很少见并且......异常)。

异常有可能比你明显的 C 风格错误处理更便宜。智能编译器可以识别出catch 块将很少见,并将它们归类为单独的缓存行或页面,确保“热”的非异常代码尽可能靠近。

【讨论】:

这并不是故事的全部。至少在几年前,仅仅在 VC++ 中启用 C++ 异常会导致百分之几的代码膨胀和轻微的性能损失。这主要是由于编译器必须跟踪需要销毁的本地对象,因为在抛出异常时堆栈被展开。【参考方案2】:

性能影响取决于异常抛出和捕获的实现。

例如,对 SSH 异常使用 __try __except 与“常规”try catch 块的开销不同。

如果您想亲自查看,只需在您的系统上自行对其进行基准测试。

异常中真正的“邪恶”在于它们破坏了程序的“正常”流程。

这通常会导致程序进入未定义状态(取决于程序员处理的好坏)。

【讨论】:

以上是关于异常代码对 C++ 性能的影响? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在代码中创建 ui 时对性能有影响吗? [关闭]

.net core 抛异常对性能影响的求证之路

C++ 社区对何时应该使用异常有普遍的共识吗? [关闭]

选择编程语言对OS性能的影响

潜在的异常会带来开销吗?

python try语句 异常 对程序运行速度的影响