D的优化级别是什么?

时间:2016-07-01 14:30:39

标签: d dub

dub下面构建优化二进制文件的升序是什么? (例如...... debug< plain< release ...)

$ dub build -h
...
      -b  --build=VALUE     Specifies the type of build to perform. Note that
                            setting the DFLAGS environment variable will override
                            the build type with custom flags.
                            Possible names:
                              debug (default), plain, release, release-debug,
                              release-nobounds, unittest, profile, profile-gc,
                              docs, ddox, cov, unittest-cov and custom types
...

dub build -b release-nobounds似乎来自dmd -O -release -boundscheck=off,那么构建fastest executables dub的等效内容是什么?

1 个答案:

答案 0 :(得分:10)

这些选项并不是关于优化(我认为dub结合它们很奇怪,在dmd本身,那些是八个独立的开关....),很多人对它们的含义感到困惑,所以让我列出,使用dmd开关名称:

  • -debug只需编译代码中的debug语句,例如debug writeln("foo");只有在使用-debug编译时才会编写foo。它没有做任何其他事情!重要的是,它不包括调试器的信息,这是使用-g完成的(尽管dub可能会将这两个选项结合起来)。

  • -ggdb等程序添加了符号调试信息,以便了解函数名称。此异常信息也用于异常堆栈跟踪打印,因此启用它将导致堆栈跟踪也显示函数名称。

  • -release禁用assert语句,inoutinvariant合同,以及@system中的自动数组边界检查函数(默认顺便提一下)。就是这样 - 它不会启用优化,也不会暗示与-debug相反,它只是跳过那些与assert相关的项目。 (请注意assert(0);是一个特殊情况,永远不会被禁用,但它永远不应该发生 - 它会杀死程序。)

  • -unittest将编译unittest块,并在运行main之前运行它们(之后main仍将继续运行,正常情况下)。

  • -profile在函数之前和之后添加时序信息,并在程序完成时将该信息写入日志文件。请注意,它仅适用于单线程程序,其日志记录可能会显着降低程序本身的速度。您可以使用它来确定哪些函数被称为最多,哪个函数最慢,以了解优化工作的重点。

  • -cov向测试日志添加信息,告诉您程序的哪些行实际运行,哪些不是。

  • -profile=gc执行特定于GC的分析,并写出包含时间信息的日志。

  • -D在编译时从代码中的ddoc信息生成HTML文件。 dub调用此docsddox类似,但使用dub-custom doc生成器而不是默认的dmd html生成器。这是ddoc的输出:http://dlang.org/phobos/std_algorithm.html这是ddox的:http://dlang.org/library/std/algorithm.html

  • -boundscheck=xxxx确定编译数组边界检查的位置 - 安全函数,所有函数或无处。 (在旧版本中,这与-release开关相关联,但现在可以单独完成)。 -release的默认值为@safe个函数,在其他任何地方,默认为所有函数。

请注意,其中没有-O-inline!这些是dmd优化开关:-O表示优化代码,-inline表示内联函数(它分别执行它们,因为有时内联会混淆调试器。其他编译器,gdc和ldc,将自动内联使用-O选项,并且通常比dmd做得更好。)

就我个人而言,我建议强烈反对使用-boundscheck-release - 这些只是在大多数情况下隐藏错误而不会在最终速度上产生很大的差异。如果您发现某些紧密循环中的边界检查会降低您的速度,而不是使用-boundscheck在整个程序中将其删除,而是使用.ptr来缓慢执行特定访问(您可以使用{{1找出要优化的函数!)在这一周的最前面了解更多信息:http://arsdnet.net/this-week-in-d/dec-06.html

如果你做了大量昂贵的断言,那么

-profile只会产生重大影响......而且,我更愿意单独版本化昂贵的版本,而不是禁用所有内容,包括真正快速检查合法的常见错误。

所以,我建议只使用-release-O进行优化的dmd构建。对于许多(但不是全部)程序,btw,-inlinegdc -O比任何dmd交换机组合做得更好 - 如果你的CPU有限,你可能也想尝试它们。

回到配音。查看包格式文档:http://code.dlang.org/package-format?lang=json

构建类型ldc -O,因此release会将dub build -b release传递给dmd。类型-O -release -inline也会添加nobounds开关。这就是dmd docs称之为最快的可执行文件,以及我称之为错误的错误。

我能看到的最好的dub选项(我实际上并没有自己使用它)是在dub配置文件(dub.json或dub.sdl)中将release-nobounds添加到buildOptions

这会为您提供optimize,然后您使用-O技术或.ptr之类的内容,在昂贵的version上有选择地加速您的热点而不会影响反bug该计划其余部分的功能。

在这里阅读更多配音文档:

http://code.dlang.org/package-format?lang=json#build-options