2016-07-01 58 views
1

dub在下面建立优化二进制的升序是多少? (例如...调试<平原<发布...)D上的优化级别是什么?

$ 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打造fastest executables

回答

8

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

  • -debug简单编译在debug语句中的代码,如如果使用-debug进行编译,debug writeln("foo");将仅写入foo。它不会做任何事情!重要的是,它不包括调试器的信息,这是通过-g完成的(尽管配音可能会结合这两个选项)。

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

  • -release禁用assert语句,inout,和invariant合同,并自动数组的边界检查在@system函数(其是顺便说一句默认值)。就是这样 - 它不会启用优化,也不意味着与-debug相反,它只是跳过那些与assert相关的项目。 (注意:assert(0);是一个特例,是永远不会被禁用,但它不应该仍会发生 - 它杀死的程序)

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

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

  • -cov在测试日志中增加了一些信息,告诉你程序的哪一行是实际运行的,哪些不是。

  • -profile=gc做GC特定分析,并写出一个日志与时间信息。

  • -D编译时从代码中的ddoc信息生成HTML文件。配音称为docsddox类似,但使用配音自定义文档生成器而不是默认的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(可以使用-profile找出哪些功能,以优化!)了解更多的一周在这里:http://arsdnet.net/this-week-in-d/dec-06.html

-release只有如果你正在做吨昂贵的断言有重大的不同... ...而且,我宁愿单独版本昂贵的,而不是禁用一切,包括真正快速检查合法的常见错误。

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


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

构建类型release,所以dub build -b release将通过-O -release -inline到DMD。 release-nobounds型也加nobounds开关。这就是dmd文档称为最快的可执行文件,以及我称之为错误的错误。

从我所看到的(我不实际使用它自己)的最佳配音的办法是在配音配置文件(dub.json或dub.sdl)

这使加buildOptionsoptimize-O,那么你用昂贵的assert的东西,如.ptr技术或version有选择地加快你的热点,而不在程序的其余部分损害防窃听功能。

了解更多配音文档浏览:

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

+0

感谢了很多关于D的编译和优化策略的深入分析。 – sof