2016-07-01 57 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