D中的异常处理开销

时间:2010-08-28 07:10:30

标签: performance exception-handling d

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

  • 如果我没有编写异常处理代码怎么办?
  • 如果我这样做会怎么样,但是没有例外?
  • 如果我这样做,会抛出异常?
  • 异常处理会导致错过任何优化机会吗?
  • 可以像许多(大多数?)C ++实现一样禁用异常处理吗?

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

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

2 个答案:

答案 0 :(得分:27)

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

首先,32位和64位计算机上的异常处理是不同的。 x86 ABI(prolog / epilog,unwinding,调用约定)更加宽松,因此编译器和程序本身必须做更多的工作。 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平台上。
  • 我怀疑你会发现异常处理是一个问题,除非你滥用例外。
  • 如果您不确定,则应衡量代码的效果。

答案 1 :(得分:6)

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

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

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