代码之家  ›  专栏  ›  技术社区  ›  Peter Alexander

D中异常处理的开销

  •  11
  • Peter Alexander  · 技术社区  · 14 年前

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

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

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

    2 回复  |  直到 14 年前
        1
  •  27
  •   Chris Schmich    14 年前

    我不能谈论D或它的编译器,但我可以告诉你一些C++、Windows和VisualStudio编译器。这可能有助于你大致了解D是如何做事的。

    首先,32位和64位机器上的异常处理是不同的。x86abi(prolog/epilog,unwinding,calling约定)更松散,因此编译器和程序本身必须做更多的工作。x86-64 ABI更为严格,操作系统发挥了更大的作用,使程序本身更容易处理异常。如果你在Windows上运行D,那么它很可能使用 SEH (结构化异常处理),如C++。

    同样,下面的所有答案都涉及Windows、C++和VisualStudio。

    如果我不写异常处理呢 代码?

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

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

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

    例外情况应该是例外 . 不要将其用于常规控制流。只能用它们来表示真正特殊的、意外的事件。基本上,您不必担心异常的代价。即使他们花了2秒钟,你也不应该在意,因为他们应该只发生在一切都南下的时候。


    重点:

    • 如果您不确定,应该衡量代码的性能。
        2
  •  6
  •   DK.    14 年前

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

    从性能方面来说,它可能与C++完全相同(或者至少非常接近)。