【问题标题】:C++ performance impact of code with exception? [closed]异常代码对 C++ 性能的影响? [关闭]
【发布时间】: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 将其视为 stackoverflow.com/questions/1018800/… 的副本是否公平?
  • 还有这个相关问题:stackoverflow.com/questions/43253/…

标签: c++ exception exception-handling


【解决方案1】:

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

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

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

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

【讨论】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多