Ich bin auf folgenden Absatz gestoßen:
„Die Einstellung Debug vs. Release in der IDE beim Kompilieren Ihres Codes in Visual Studio hat fast keinen Einfluss auf die Leistung. Der generierte Code ist nahezu identisch. Der C # -Compiler führt keine wirkliche Optimierung durch. Der C # -Compiler spuckt nur IL aus… und zur Laufzeit übernimmt der JITer die gesamte Optimierung. Der JITer verfügt über einen Debug- / Release-Modus, der die Leistung erheblich verbessert. Das hängt jedoch nicht davon ab, ob Sie die Debug- oder Release-Konfiguration Ihres Projekts ausführen, sondern davon, ob ein Debugger angeschlossen ist. “
Die Quelle ist hier und der Podcast ist hier .
Kann mich jemand auf einen Microsoft-Artikel verweisen, der dies tatsächlich beweisen kann?
Wenn Sie " C # -Debug vs. Release-Leistung " googeln, werden meistens Ergebnisse zurückgegeben, die besagen, dass " Debug hat einen großen Leistungseinbruch ", " Release ist optimiert " und " Debug nicht für die Produktion bereitstellen ".
quelle
Antworten:
Teilweise wahr. Im Debug-Modus gibt der Compiler Debug-Symbole für alle Variablen aus und kompiliert den Code unverändert. Im Release-Modus sind einige Optimierungen enthalten:
Der Rest liegt bei der GEG.
Vollständige Liste der Optimierungen hier mit freundlicher Genehmigung von Eric Lippert .
quelle
Es gibt keinen Artikel, der etwas über eine Leistungsfrage "beweist". Der Weg, um eine Aussage über die Auswirkungen einer Änderung auf die Leistung zu beweisen, besteht darin, sie in beide Richtungen auszuprobieren und unter realistischen, aber kontrollierten Bedingungen zu testen.
Sie stellen eine Frage zur Leistung, also ist Ihnen die Leistung klar. Wenn Sie sich für Leistung interessieren, ist es das Richtige, einige Leistungsziele festzulegen und sich dann eine Testsuite zu schreiben, die Ihren Fortschritt anhand dieser Ziele verfolgt. Sobald Sie eine solche Testsuite haben, können Sie sie leicht verwenden, um die Wahrheit oder Falschheit von Aussagen wie "Der Debug-Build ist langsamer" selbst zu testen.
Darüber hinaus können Sie aussagekräftige Ergebnisse erzielen. "Langsamer" ist bedeutungslos, da nicht klar ist, ob es eine Mikrosekunde langsamer oder zwanzig Minuten langsamer ist. "10% langsamer unter realistischen Bedingungen" ist sinnvoller.
Verbringen Sie die Zeit, die Sie damit verbracht hätten, diese Frage online zu recherchieren, um ein Gerät zu bauen, das die Frage beantwortet. Auf diese Weise erhalten Sie weitaus genauere Ergebnisse. Alles, was Sie online lesen, ist nur eine Vermutung darüber, was passieren könnte . Grund dafür sind Fakten, die Sie selbst gesammelt haben, und nicht die Vermutungen anderer, wie sich Ihr Programm verhalten könnte.
quelle
Ich kann die Leistung nicht kommentieren, aber der Ratschlag „Debuggen nicht für die Produktion bereitstellen“ gilt immer noch, weil Debug-Code in großen Produkten normalerweise einige Dinge anders macht. Zum einen sind möglicherweise Debug-Schalter aktiv, zum anderen werden wahrscheinlich zusätzliche redundante Überprüfungen und Debug-Ausgaben durchgeführt, die nicht zum Produktionscode gehören.
quelle
Von msdn social
Grundsätzlich ist die Debug-Bereitstellung langsamer, da die JIT-Compiler-Optimierungen deaktiviert sind.
quelle
Was Sie lesen, ist durchaus gültig. Die Freigabe ist aufgrund der JIT-Optimierung in der Regel schlanker, ohne Debug-Code (#IF DEBUG oder [Conditional ("DEBUG")]), minimales Laden von Debug-Symbolen und wird häufig nicht berücksichtigt, da kleinere Assemblys die Ladezeit verkürzen. Eine andere Leistung ist beim Ausführen des Codes in VS aufgrund umfangreicherer PDBs und geladener Symbole offensichtlicher. Wenn Sie ihn jedoch unabhängig ausführen, sind die Leistungsunterschiede möglicherweise weniger offensichtlich. Bestimmte Codes optimieren besser als andere und verwenden dieselben Optimierungsheuristiken wie in anderen Sprachen.
Scott hat eine gute Erklärung auf Inline - Methode Optimierung hier
In diesem Artikel wird kurz erläutert, warum sich die Einstellungen für Debug und Release in der ASP.NET-Umgebung unterscheiden.
quelle
Eine Sache, die Sie beachten sollten, was die Leistung betrifft und ob der Debugger angeschlossen ist oder nicht, hat uns überrascht.
Wir hatten einen Code, der viele enge Schleifen enthielt, deren Debugging ewig zu dauern schien, der jedoch von sich aus recht gut lief. Mit anderen Worten, keine Kunden oder Kunden hatten Probleme, aber beim Debuggen schien es wie Melasse zu laufen.
Der Schuldige war einer
Debug.WriteLine
in einer der engen Schleifen, die Tausende von Protokollnachrichten ausspuckten, die vor einiger Zeit von einer Debug-Sitzung hinterlassen wurden. Es scheint, dass, wenn der Debugger angehängt ist und solche Ausgaben abhört, Overhead entsteht, der das Programm verlangsamt. Für diesen bestimmten Code lag die Laufzeit allein in der Größenordnung von 0,2 bis 0,3 Sekunden und mehr als 30 Sekunden, wenn der Debugger angehängt wurde.Einfache Lösung: Entfernen Sie einfach die nicht mehr benötigten Debug-Meldungen.
quelle
In msdn Seite ...
quelle
Dies hängt in hohem Maße davon ab, ob Ihre App rechengebunden ist, und es ist nicht immer leicht zu erkennen, wie im Beispiel von Lasse. Wenn ich die geringste Frage dazu habe, was es tut, halte ich es einige Male an und untersuche den Stapel. Wenn etwas Besonderes los ist, das ich nicht wirklich brauchte, wird es sofort erkannt.
quelle
Ich bin kürzlich auf ein Leistungsproblem gestoßen. Die vollständige Liste der Produkte dauerte zu lange, etwa 80 Sekunden. Ich habe die Datenbank optimiert, die Abfragen verbessert und es gab keinen Unterschied. Ich entschied mich für ein TestProjekt und stellte fest, dass der gleiche Prozess in 4 Sekunden ausgeführt wurde. Dann wurde mir klar, dass sich das Projekt im Debug-Modus und das Testprojekt im Release-Modus befand. Ich habe das Hauptprojekt in den Release-Modus geschaltet und die vollständige Liste der Produkte dauerte nur 4 Sekunden, um alle Ergebnisse anzuzeigen.
Zusammenfassung: Der Debug-Modus ist weitaus langsamer als der Ausführungsmodus, da weiterhin Informationen debuggt werden. Sie sollten immer im Relase-Modus bereitstellen. Sie können weiterhin Debugging-Informationen haben, wenn Sie .PDB-Dateien einschließen. Auf diese Weise können Sie beispielsweise Fehler mit Zeilennummern protokollieren.
quelle
Debug- und Release-Modi weisen Unterschiede auf. Es gibt ein Tool Fuzzlyn : Es ist ein Fuzzer, der Roslyn verwendet, um zufällige C # -Programme zu generieren. Es führt diese Programme auf .NET Core aus und stellt sicher, dass sie beim Kompilieren im Debug- und Release-Modus dieselben Ergebnisse liefern.
Mit diesem Tool wurden viele Fehler gefunden und gemeldet.
quelle