【问题标题】:Overhead of exception handling in DD中异常处理的开销
【发布时间】:2010-08-28 07:10:29
【问题描述】:

在 D2 编程语言中,使用异常处理对性能有何影响?特别是:

  • 如果我不编写异常处理代码怎么办?
  • 如果我这样做了,但没有抛出异常怎么办?
  • 如果我这样做了,但抛出异常怎么办?
  • 异常处理是否会导致错过任何优化机会?
  • 能否像在许多(大多数?)C++ 实现中那样禁用异常处理?

我知道几乎所有商业游戏开发工作室都在其 C++ 中禁用异常处理,因为正确处理异常会影响性能并增加开发时间。我知道 D 让后者不那么痛苦,但性能呢?

当然,这可能都是实现定义的,所以对于这个问题,请关注DMD编译器。

【问题讨论】:

    标签: performance exception-handling d


    【解决方案1】:

    我不能谈论 D 或其任何编译器,但我可以告诉你一些关于 C++、Windows 和 Visual Studio 编译器的信息。这可能有助于您大致了解 D 是如何做事的。

    首先,32 位和 64 位机器上的异常处理是不同的。 x86 ABI(prolog/epilog,unwinding,calling convention)更加宽松,所以编译器和程序本身必须做更多的工作。 x86-64 ABI 更严格,操作系统发挥更大的作用,使程序本身更容易处理异常。如果您在 Windows 上运行 D,那么它可能会像 C++ 一样使用SEH(结构化异常处理)。

    同样,我在下面的所有答案都与 Windows、C++ 和 Visual Studio 相关。

    如果我不写异常处理怎么办 代码?

    x86/x86-64:该方法没有成本。

    如果我这样做了,但没有例外 扔过吗?

    x86:即使不抛出异常也是有代价的。异常处理信息被推送到 TIB(线程信息块)中,例如初始作用域和特定于函数的异常处理程序。为了知道要销毁哪些对象以及要搜索哪些处理程序,需要维护一个范围变量。当您输入 try 块并构造具有析构函数的堆栈对象时,此范围变量会更新。

    x86-64:由于更严格的规则,没有额外的代码(或者非常非常少)。与 x86 相比,这是一个很大的优势。

    如果我这样做了怎么办,例外是 扔了?

    在 x86 或 x86-64 上,肯定会大受欢迎。 例外应该是例外。不要将它们用于常规控制流。仅使用它们来表示真正异常的意外事件。从本质上讲,您永远不必担心异常的成本。即使它们花了 2 秒,你也不应该在意,因为它们只会在一切都向南时才会发生。

    话虽如此,在 x86-64 上抛出异常比在 x86 上抛出异常更昂贵。 x86-64 架构针对不抛出异常的情况进行了优化,理想情况下,几乎始终如此。


    大图:

    • 我看不出传播错误代码比异常处理快得多,尤其是在 x64 平台上。
    • 我怀疑您是否会发现异常处理是一个问题,除非您滥用异常。
    • 如果您不确定,您应该衡量代码的性能。

    【讨论】:

    • 一般情况下的出色响应。我还要说,如果编写异常感知代码会减慢开发速度,那么您之前的进度太快了,如果“几乎所有”工作室禁用异常处理,他们就是在自取其辱。可以说,大型项目比小型项目从异常感知代码中受益更多。事实上,Fallout 3 大约在发布时就浮现在脑海中,如果我记得那个游戏似乎大量使用异常,不幸的是他们并没有处理所有的异常。
    • 嗨,克里斯!请您推荐一些详细描述该问题的书吗?
    • @D_E:不幸的是,编译器实现有点神秘,异常处理更是如此(因为它涉及操作系统、语言、运行时和编译器)。我的知识来自于在 Microsoft 的性能分析团队工作。我建议您在线搜索,因为我认为这将是您最好的选择。
    • “x86/x86-64:该方法没有成本。”考虑到更大的代码量和更少的优化机会,你真的可以这么说吗?
    【解决方案2】:

    据我所知,DMD 使用平台上的任何本机机制。在 Windows 上,这将是结构化异常处理,MSVC++ 也使用它来实现异常。

    在 linux 上,我相信它使用 GCC 使用的相同异常表机制。在其他平台上,我不知道。

    就性能而言,它可能与 C++ 相同(或至少非常接近)。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多