D中的异常处理开销

Pet*_*der 11 performance exception-handling d

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

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

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

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

Chr*_*ich 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平台上.
  • 我怀疑你会发现异常处理是一个问题,除非你滥用异常.
  • 如果您不确定,则应衡量代码的性能.


DK.*_*DK. 6

据我所知,DMD使用平台上的本机机制.在Windows中,这将是结构化异常处理是什么也被MSVC++实现的例外.

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

在性能方面,它可能与C++相同(或至少非常接近).