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
...
Run Code Online (Sandbox Code Playgroud)
这dub build -b release-nobounds
似乎来源于dmd -O -release -boundscheck=off
,那么dub
构建最快的可执行文件的等价物是什么?
Ada*_*ppe 10
这些选项并不是真正的优化(我认为dub结合它们很奇怪,在dmd本身,那些是八个独立的开关....),很多人都对它们的含义感到困惑,所以让我吧列表,使用dmd开关名称:
-debug
只需在debug
代码中的语句中编译,例如,debug writeln("foo");
只有在编译时才会写入foo -debug
.它没有做任何其他事情!重要的是,它不包括调试器的信息,这是完成的-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文件.配音称之为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
is @safe
函数,在其他任何地方,默认为所有函数.
请注意,那些没有-O
或者-inline
!这些是dmd优化开关:-O
优化代码的-inline
方法和内联函数的方法(它是单独执行的,因为有时内联会混淆调试器.其他编译器,gdc和ldc,将自动内联其-O
选项并通常更好地工作它比dmd还要好.)
就个人而言,我强烈反对使用-boundscheck
和-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 docs称为最快的可执行文件,以及我称之为错误的错误.
从我所看到的最好的配音选项(我实际上并不自己使用它)将添加buildOptions
到optimize
配音文件(dub.json或dub.sdl)中
这给了你-O
,然后你使用像.ptr
技术或version
昂贵的东西assert
有选择地加快你的热点,而不会影响程序其余部分的反bug功能.
在这里阅读更多配音文档:
http://code.dlang.org/package-format?lang=json#build-options