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
Vielen Dank viel für Ihre gründliche Analyse auf D's Compilieren und Optimierungsstrategien. – sof