3

dub下面构建优化二进制文件的升序是什么?(例如...调试<普通<发布...)

$ 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,那么dub构建最快的可执行文件的等价物是什么?

4

1 回答 1

14

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

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

  • -g添加符号调试信息,用于想gdb知道函数名称的程序。同样的信息也用于异常堆栈跟踪打印,因此启用它会导致堆栈跟踪也显示函数名称。

  • -release禁用assert语句in、、、outinvariant协定,并在函数中自动检查数组边界@system(这是默认的 btw)。就是这样 - 它不启用优化也不暗示相反-debug,它只是跳过那些assert相关的项目。(请注意,这assert(0);是一种特殊情况,永远不会被禁用,但无论如何都不应该发生 - 它会杀死程序。)

  • -unittest将编译这些unittest块,并在运行之前运行它们main(然后main仍然会像往常一样运行)。

  • -profile在函数之前和之后添加计时信息,并在程序完成时将该信息写入日志文件。请注意,它仅适用于单线程程序,并且其日志记录会显着减慢程序本身的速度。您将使用它来确定哪些函数被调用的次数最多和最慢,从而知道将优化工作集中在哪里。

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

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

  • -D编译时从代码中的 ddoc 信息生成 HTML 文件。配音称此docsddox类似,但使用 dub-custom 文档生成器而不是默认的 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 好。)

就个人而言,我强烈建议不要使用-boundscheckand -release- 它们在大多数情况下只是隐藏错误,而不会对最终速度产生太大影响。如果您发现某些紧密循环中的边界检查会减慢您的速度,请不要在整个程序中使用 来杀死它-boundscheck,而是.ptr在速度较慢的特定访问上使用(您可以使用-profile它来确定要优化的函数!)了解更多关于本周提示:http: //arsdnet.net/this-week-in-d/dec-06.html

-release只有在您执行大量昂贵的断言时才会产生显着差异......而且,我更愿意单独版本化昂贵的断言而不是禁用所有内容,包括捕获合法常见错误的真正快速检查。

-O所以,我建议只做-inline一个优化的 dmd 构建。顺便说一句,对于许多(但不是全部)程序,gdc -O并且ldc -O比任何 dmd 开关组合做得更好 - 如果您的 CPU 有限,您可能也想尝试它们。


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

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

我所看到的最好的配音选项(我自己实际上并没有使用它)是添加buildOptionsoptimize配音配置文件(dub.json 或 dub.sdl)中

这给了你-O,然后你使用.ptr技术或version昂贵的东西assert来选择性地加速你的热点,而不会损害程序其余部分的反错误功能。

在此处阅读更多配音文档:

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

于 2016-07-01T16:09:27.123 回答