10

コードの最適化のためDebugger.Log()に、プリプロセッサ ディレクティブで呼び出しをラップする必要がありますか? それとも、C# コンパイラは、構成を構築するときに最適化されたコードを生成しますか?#if (DEBUG)RELEASE

4

3 に答える 3

1

これは、リファレンスソースから取得したDebugger.Log()の宣言です。

// Posts a message for the attached debugger.  If there is no
// debugger attached, has no effect.  The debugger may or may not
// report the message depending on its settings.
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern void Log(int level, String category, String message);

メソッドには[Conditional]属性がなく、[MethodImplAtttribute]属性を持っていることに注意してください。これは、メソッドが実際にCLRに実装され、C++コードで記述されていることを意味します。

したがって、構成に関係なく、メソッド呼び出し行われます。メソッドの実装は、SSCLI20ソースディストリビューションclr / src / vm/debugdebugger.cppから見つけることができます。デバッガーに文字列が接続されている場合はそれを表示するwinapi関数であるOutputDebugString()を使用します。または、SysInternalsのDbgView.exeなどのユーティリティで。どちらも存在しない場合、API呼び出しは何もせず、すぐに戻ります。ほんの数ナノ秒の関数呼び出しのオーバーヘッドに対してのみ支払います。

メソッド呼び出しについて最適化するのに適切なものは何もありません。デバッグ構成とリリース構成のどちらをビルドする場合でも、同じように実行されます。リリースビルドのデバッグ情報にアクセスできることは確かに便利です。それをオフにする機能かどうかを判断するのはあなた次第です。これらのナノ秒がプログラムに目に見える影響を与えるかどうかはわかりません。測定、何も想定しないでください。

于 2012-06-11T14:55:06.777 に答える