2016-07-01 6 views
1

Wie lautet die aufsteigende Reihenfolge für die dub, um die optimierte Binärdatei unten zu erstellen? (Z ... debug < Ebene < Mitteilung ...)Was sind die Optimierungsstufen auf 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 
... 

Die dub build -b release-nobounds von dmd -O -release -boundscheck=off abgeleitet zu sein scheint, was so ist das Äquivalent für dubfastest executables zu bauen?

Antwort

8

Bei diesen Optionen geht es nicht wirklich um Optimierungen (und ich finde es komisch, dass Dub sie kombiniert, auf dmd selbst sind das acht unabhängige Switches ....), und viele Leute sind verwirrt darüber, was sie bedeuten lassen Sie mich so Liste, die DMD-Schalter Namen:

  • -debug kompiliert einfach in debug Anweisungen im Code, zB debug writeln("foo"); schreibt foo nur, wenn es mit -debug kompiliert wird. Es macht nichts anderes! Wichtig ist, dass es keine Informationen für Debugger enthält, die mit -g erstellt wurden (obwohl Dub diese beiden Optionen kombinieren könnte).

  • -g fügt symbolische Debugging-Informationen für Programme wie gdb hinzu, um Funktionsnamen zu kennen. Dieselben Informationen werden auch beim Drucken von Stapeln von Ausnahmestapeln verwendet. Wenn Sie diese Option aktivieren, werden die Stack-Traces auch Funktionsnamen anzeigen.

  • -release deaktiviert assert Aussagen, in, out und invariant Verträge und automatische Arraygrenzen prüfen in @system Funktionen (die der Standard btw sind). Das ist es - es ermöglicht weder Optimierungen noch das Gegenteil von -debug, es überspringt einfach die assert-bezogenen Elemente. (Beachten Sie, dass assert(0); ein Sonderfall ist und wird nie deaktiviert, aber es sollte sowieso nie passieren -. Es das Programm tötet)

  • -unittest werden die unittest Blöcke zusammenstellen und führen sie direkt vor main läuft (dann main wird noch Lauf danach, wie normal).

  • -profile fügt Timing-Informationen vor und nach Funktionen hinzu und schreibt diese Informationen in eine Protokolldatei, wenn das Programm abgeschlossen ist. Beachten Sie, dass es nur mit Single-Thread-Programmen funktioniert und seine Protokollierung kann das Programm erheblich verlangsamen. Sie würden es verwenden, um herauszufinden, welche Funktionen am häufigsten und am langsamsten zu wissen sind, wo Sie Ihre Optimierungsbemühungen konzentrieren können.

  • -cov fügt dem Testprotokoll Informationen hinzu, die angeben, welche Zeilen Ihres Programms tatsächlich ausgeführt wurden und welche nicht.

  • -profile=gc macht GC-spezifische Profilerstellung und schreibt ein Protokoll mit den Timing-Informationen.

  • -D generiert HTML-Dateien aus den ddoc-Informationen in Ihrem Code während der Kompilierung. Dub nennt dies docs. ddox ist ähnlich, verwendet aber einen dub-benutzerdefinierten doc-Generator anstelle des Standard-dmd-html-Generators. Dies ist Ausgabe des DDOC: http://dlang.org/phobos/std_algorithm.html und das ist ddox suchen: http://dlang.org/library/std/algorithm.html

  • -boundscheck=xxxx bestimmt, wo Feldgrenzen Prüfung kompiliert wird - sichere Funktionen, um alle Funktionen, oder nirgends.(In alten Versionen war dies an den -release Switch gebunden, kann aber jetzt separat erfolgen). Der Standard für -release ist @safe Funktionen, überall sonst ist der Standard alle Funktionen.

Beachten Sie, dass keiner von denen -O oder -inline waren! Das sind die dmd-Optimierungsschalter: -O bedeutet, den Code zu optimieren und -inline bedeutet inline-Funktionen (es macht sie separat, weil manchmal Inline Debugger verwirrt. Die anderen Compiler, gdc und ldc, werden automatisch mit ihren -O Optionen inline und in der Regel tun . besser davon als dmd sowieso)

persönlich empfehle ich gegen mit -boundscheck und -release - die, die gerade Bugs in den meisten Fällen verstecken, ohne auf Endgeschwindigkeit so groß ein Unterschied zu machen. Wenn Sie feststellen, dass Überprüfungen in einer engen Schleife Sie verlangsamen, anstatt sie in Ihrem gesamten Programm mit -boundscheck zu beseitigen, verwenden Sie stattdessen .ptr für die spezifischen Zugriffe, die langsam sind (Sie können -profile verwenden, um herauszufinden, welche Funktion optimiert werden soll!) mehr an der Spitze hier der Woche: http://arsdnet.net/this-week-in-d/dec-06.html

-release macht nur einen signifikanten Unterschied, wenn Sie Tonnen teuer behauptet tun ... und wieder, würde ich auf der Version aus den teueren lieben einzeln anstatt alles zu deaktivieren, einschließlich der wirklich schnellen Checks, die recht häufige Bugs fangen.

Also, ich würde für nur -O und vielleicht -inline für eine optimierte DMD-Build empfehlen. Für viele (aber nicht alle) Programme btw, gdc -O und ldc -O machen Sie einen besseren Job als jede DMD-Switch-Kombination - wenn Sie CPU-begrenzt sind, möchten Sie vielleicht auch versuchen.


Zurück zum Überspielen. Schauen Sie sich die Paketformat Dokumentation: http://code.dlang.org/package-format?lang=json

Build-Typ release, so dub build -b release vergehen -O -release -inline dmd. Der Typ release-nobounds fügt den nobounds-Schalter hinzu. Das nennt die dmd-Dokumentation die schnellsten ausführbaren Dateien, und das nenne ich einen fehlerhaften Fehler.

Die beste dub Option von dem, was ich sehen kann (ich eigentlich es selbst nicht verwenden) wäre buildOptions-optimize in der Dub-Konfigurationsdatei (dub.json oder dub.sdl)

hinzufügen Das gibt Sie -O, dann verwenden Sie Sachen wie die .ptr Technik oder version auf teure assert, um selektiv Ihre Hotspots zu beschleunigen, ohne die Anti-Bug-Funktionen im Rest des Programms zu kompromittieren.

Lesen Sie mehr dub Dokumentation hier:

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

+0

Vielen Dank viel für Ihre gründliche Analyse auf D's Compilieren und Optimierungsstrategien. – sof

Verwandte Themen