这些选项并不是真正的优化(我认为 dub 将它们结合起来很奇怪,在 dmd 本身上,那些是八个独立的开关......),很多人对它们的含义感到困惑,所以让我列表,使用 dmd 开关名称:
-debug
只需在代码中的debug
语句中编译,例如,debug writeln("foo");
如果使用-debug
. 它没有做任何其他事情!重要的是,它不包括调试器的信息,这是完成的-g
(尽管 dub 可能会结合这两个选项)。
-g
添加符号调试信息,用于想gdb
知道函数名称的程序。同样的信息也用于异常堆栈跟踪打印,因此启用它会导致堆栈跟踪也显示函数名称。
-release
禁用assert
语句in
、、、out
和invariant
协定,并在函数中自动检查数组边界@system
(这是默认的 btw)。就是这样 - 它不启用优化也不暗示相反-debug
,它只是跳过那些assert
相关的项目。(请注意,这assert(0);
是一种特殊情况,永远不会被禁用,但无论如何都不应该发生 - 它会杀死程序。)
-unittest
将编译这些unittest
块,并在运行之前运行它们main
(然后main
仍然会像往常一样运行)。
-profile
在函数之前和之后添加计时信息,并在程序完成时将该信息写入日志文件。请注意,它仅适用于单线程程序,并且其日志记录会显着减慢程序本身的速度。您将使用它来确定哪些函数被调用的次数最多和最慢,从而知道将优化工作集中在哪里。
-cov
向测试日志添加信息,告诉您程序的哪些行实际运行,哪些没有运行。
-profile=gc
执行特定于 GC 的分析,并写出包含时间信息的日志。
-D
编译时从代码中的 ddoc 信息生成 HTML 文件。配音称此docs
。ddox
类似,但使用 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 好。)
就个人而言,我强烈建议不要使用-boundscheck
and -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 文档所说的最快的可执行文件,我称之为错误的错误。
我所看到的最好的配音选项(我自己实际上并没有使用它)是添加buildOptions
到optimize
配音配置文件(dub.json 或 dub.sdl)中
这给了你-O
,然后你使用.ptr
技术或version
昂贵的东西assert
来选择性地加速你的热点,而不会损害程序其余部分的反错误功能。
在此处阅读更多配音文档:
http://code.dlang.org/package-format?lang=json#build-options