D的优化级别是什么?

sof*_*sof 2 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
...
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,outinvariant合同,并自动阵列界定在检查@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交换机绑定,但现在可以单独完成).默认为-releaseis @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称为最快的可执行文件,以及我称之为错误的错误.

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

这给了你-O,然后你使用像.ptr技术或version昂贵的东西assert有选择地加快你的热点,而不会影响程序其余部分的反bug功能.

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

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