以前の開発者の中には、デバッグモードでビルドされたアセンブリの一部を本番環境に組み込むものがありました。それらをリリースモードで再コンパイルして再デプロイする価値はありますか? 1〜2%の性能向上があれば、そこに残すだけです。一方、10〜20%の増加は私の心を変えるかもしれません。デバッグとリリースモードでビルドされた.NETアセンブリのパフォーマンスの違いはありますか?
答えて
私たちは生産上の大きなパフォーマンス上の問題を抱えていたため、これは1年前と同じ質問です。 MS Premierのサポートから私に説明されていたように、デバッグビルドバージョンにはデバッグ用のフックが含まれているため、アプリケーションの機能に応じてメモリ消費量が約1〜10%増加する可能性があります。
問題が発生していない場合はそのままにしておきますが、メモリ消費に問題がある場合は、先に進んで再コンパイル/デプロイしてください。
私の経験では、30-40%の違いが見られました。これはDotNetZipであり、暗号化、圧縮、およびファイルI/Oが少ないライブラリです。 85%以上の時間が暗号化と圧縮に費やされ、バイトを動かすだけでした。
デバッグシンボルをロードする必要があるため、デバッグビルドを本番環境で使用することについてのもう1つの議論は、より多くのメモリを消費するためです。
通常、リリースバージョンは/optimize
コンパイラオプションを使用して最適化されてコンパイルされるため、利点があります。ただし、その差異の大きさは、特定のアセンブリによって異なります。プロファイルする必要があります。
私は、コードの複雑さによって指数関数的に増加することを発見しました。単純なアプリケーションでは5%の差しか見られないかもしれませんが、複雑なアプリケーション、特にアプリケーションでは50%配列や地図のようなより大きなデータ構造を必要とする。
設定の仕方によっては、デバッグコードも若干異なる可能性があります。たとえば、アサーションを見てください。
それは同様に、そのリリースコードはまた、いくつかのプリプロセッサのものを削除し、注目に値する:それはまたDebug.WriteLine、Debug.Assertの、とすることができたSystem.Diagnostics名前空間内のいくつかの他のものを削除し
#if DEBUG
...
#endif
テストでは役に立ちますが、リリースビルド用にうまく設計されたコードでは無意味です。
DebugおよびReleaseビルド用に生成されたILコードを見ると、その差異は一般に小さいです。ほとんどの違いは、EditとContinue、およびソース行のデバッグをサポートするために、キーのソース・ポイントに追加のnopコマンドがあります。しかし、.NETランタイムが実際にMSILをJITするとき、ランタイムアセンブリはほとんど同じです。最も大きな違いは、デバッガが接続されている場合です。これにより、JITは実際の実行コードを最適化できなくなります。
リリースバージョンは、コードをあまり含まないため、多くの場合、かなり小さくなります。 #if DEBUGステートメントで囲まれたコードのパッチや、リリースモードのメソッド(Debug.WriteLineなど)をコンパイラに省略するようにコンパイラに指示する条件付き属性があります。
Debug.WriteLineおよびTrace.WriteLineメソッドは、本番用のコードに残しておけば、デバッガがアタッチされていない場合でもパフォーマンスに大きな影響を与えることがわかりました。
- 1. Microsoft Visual Studio:デバッグDLLは、リリースモードでビルドされたバイナリで使用されます
- 2. デバッグ.netアセンブリのアンマネージコード
- 3. マニフェストがmvnアセンブリでビルドされたときのクラスパスがありません
- 4. 難読化された.Netアセンブリをデバッグします
- 5. djangoクエリとストアドプロシージャ(MySQL)のパフォーマンスの違いはありますか?
- 6. HAVINGとエイリアスのパフォーマンスに違いはありますか?
- 7. Silverlight - C#とVB.netイベントハンドラのパフォーマンスに違いはありますか?
- 8. スイッチブロックから戻ったときのパフォーマンスの違いはありますか?
- 9. GCCで最適化されたリリースモードでのビルド方法は?
- 10. アセンブリがありません。System.Net.Http.PrimitivesとSystem.Net.Http.Extensions.dllがビルドされています
- 11. リリースモードでのデバッグ方法は?
- 12. SQLAlchemyでは、.first()と[0]のパフォーマンスの違いはありますか?
- 13. .NETの 'Debug'ビルドと 'Release'ビルドの主な違いは何ですか?
- 14. STRING(MAX)のパフォーマンスの違いはありますか?
- 15. forループのパフォーマンスの違いはありますか?
- 16. 生成された.NETアセンブリを生成したアプリケーション内からデバッグする
- 17. node.js/Javaで記述されたAWSラムダ関数のパフォーマンス/機能の違いはありますか?
- 18. jsp内でJavaを書くときにパフォーマンスの違いはありますか?
- 19. NSCountResultTypeとcountForFetchRequestに違いがありますか?エラー:パフォーマンスの面では?
- 20. 速度とパフォーマンスに関するSDL_HWSURFACEとSDL_SWSURFACEの違いはありますか?
- 21. リリースモードでのデバッグの短所
- 22. .NET ClickOnceのデプロイメントと間違ったアセンブリが更新されたバージョン
- 23. .NETアプリケーションドメインのアセンブリをリロードする方法はありますか。
- 24. これら2つのクエリの間にパフォーマンスの違いはありますか?
- 25. Slickテストで診断のデバッグ情報が表示され、パフォーマンスが低下することはありますか?
- 26. デバッグ/リリースモードでSqliteバイナリをビルドする方法
- 27. Webアプリケーションのコンテキストでwin32 dllと.net dllの違いはありますか?
- 28. angle $ filterとFilter suffixed nameの間にパフォーマンスの違いはありますか?
- 29. Windows 2008サーバーとWindows 8.1 OSのガベージコレクタのパフォーマンスに違いはありますか?
- 30. コンパイルdebug = "false"とリリースモードの違いは何ですか?