在D2编程语言中,使用异常处理有什么性能影响?特别是:
我知道几乎所有商业游戏开发工作室都会在其C ++中禁用异常处理,因为它会影响性能,并增加与正确处理异常相关的开发时间。我知道D使后者不那么痛苦,但性能呢?
当然,这可能都是实现定义的,所以对于这个问题,请关注DMD编译器。
答案 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体系结构在没有抛出异常的情况下进行了优化,理想情况下几乎一直都是这样。
大图:
答案 1 :(得分:6)
据我所知,DMD使用平台上的本机机制。在Windows上,这将是结构化异常处理,MSVC ++也使用它来实现异常。
在linux上,我相信它使用了与GCC相同的异常表机制。在其他平台上,我不知道。
就性能而言,它可能与C ++相同(或至少非常接近)。