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
的等效内容是什么?
答案 0 :(得分:10)
这些选项并不是关于优化(我认为dub结合它们很奇怪,在dmd本身,那些是八个独立的开关....),很多人对它们的含义感到困惑,所以让我列出,使用dmd开关名称:
-debug
只需编译代码中的debug
语句,例如debug writeln("foo");
只有在使用-debug
编译时才会编写foo。它没有做任何其他事情!重要的是,它不包括调试器的信息,这是使用-g
完成的(尽管dub可能会将这两个选项结合起来)。
-g
为gdb
等程序添加了符号调试信息,以便了解函数名称。此异常信息也用于异常堆栈跟踪打印,因此启用它将导致堆栈跟踪也显示函数名称。
-release
禁用assert
语句,in
,out
和invariant
合同,以及@system
中的自动数组边界检查函数(默认顺便提一下)。就是这样 - 它不会启用优化,也不会暗示与-debug
相反,它只是跳过那些与assert
相关的项目。 (请注意assert(0);
是一个特殊情况,永远不会被禁用,但它永远不应该发生 - 它会杀死程序。)
-unittest
将编译unittest
块,并在运行main
之前运行它们(之后main
仍将继续运行,正常情况下)。
-profile
在函数之前和之后添加时序信息,并在程序完成时将该信息写入日志文件。请注意,它仅适用于单线程程序,其日志记录可能会显着降低程序本身的速度。您可以使用它来确定哪些函数被称为最多,哪个函数最慢,以了解优化工作的重点。
-cov
向测试日志添加信息,告诉您程序的哪些行实际运行,哪些不是。
-profile=gc
执行特定于GC的分析,并写出包含时间信息的日志。
-D
在编译时从代码中的ddoc信息生成HTML文件。 dub调用此docs
。 ddox
类似,但使用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,-inline
和gdc -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