2011-01-31 5 views
5

System.Diagnostics.StackTraceを使用するlogger/exceptionfactoryモジュールを作成して、呼び出しメソッドとその宣言型から属性を取得しました。しかし、リリースモードでVisual Studioの外でコードを実行すると、私の短いメソッドの一部がインラインでスタックトレースから抜けてしまうことに気付きました。今はメソッドが実行時にインライン化されるかどうかをテストする方法はありませんが、私はすべての重要なメソッドを[MethodImpl(MethodImplOptions.NoInlining)]にしたくありません。しかし、私の基底クラスのメソッドが欠けていると、レイヤーと操作情報を誤読でき、誤ったログや誤った例外が発生する可能性があります。.NETでログインするためのスタックトレース

いつ、どこでインライン化されるのかのルールはありますか?仮想メソッド、静的メソッド、基本クラスメソッドは多少処理されますか?アセンブリ内のインライン展開について心配する必要はありますか?名前空間の内部?

+0

[CLRによってインライン化される方法はいつですか?](http://stackoverflow.com/questions/4660004/when-is-a-method-eligible-to-be-inlined-by -the-clr) –

答えて

5

はい、いくつかのルールがありますが、JITコンパイラで使用されるヒューリスティックであり、これらのヒューリスティックは瞬時に変更される可能性があります。

  1. 仮想メソッドはインライン化できません。
  2. インターフェイスメソッドはインライン化されていますが、スタックトレースを折りたたむかどうかは100%確信していません。
  3. 静的メソッドと非仮想インスタンスメソッドは確実にインライン化できます。
  4. インライン展開は、JITがメソッド呼び出しをコンパイルするときに実行時に発生するため、名前空間(もちろん)とアセンブリ(あまり明白ではありません)をクロスする可能性があります。
  5. "重い"メソッドはインライン化されません。これは "重い"の定義に依存し、JITが適用するヒューリスティックの一部です。私の知る「重い」のためのヒューリスティクスの

一部:例外処理を使用

  • 方法は(すなわち、キャッチを試みるか、してみてください-finallyブロック)インライン化されていません。
  • 大きなコード(〜32ILバイトですが、これを覚えている可能性があります)を持つメソッドはインライン化されません。
  • ループを持つメソッドは、ループが完全に展開または削除されない限り、インライン化されません。
+0

ちょうど:)より完璧です。私の重要なすべての方法は、試してみることから始まります... – TDaver

2

ヒューリスティックはすべてジッタの実装の詳細であり、正式に文書化されておらず、いつでも変更される可能性があることを意味します。

関連する問題