TargetedPatchingOptOut:「NGen画像の境界を越えてインライン化するために重要なパフォーマンス」?


140

リフレクターを使用していくつかのフレームワーククラスを調べたところ、多くのメソッドとプロパティに次の属性があることがわかりました

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]

上記のコメントをどこかで見たことがあり、フォローアップしたことはないと確信しています。

誰かがこれがC#およびその他のコンテキストで何を意味するか教えていただけませんか?

回答:


176

別のアセンブリでも、適用先のメソッドをインライン化しても問題ないことをNGenに伝えます。

例えば:

  • String.Equals 持っている [TargetedPatchingOptOut]
  • 呼び出すプログラムを書く String.Equals
  • 最大のパフォーマンスを得るには、このプログラムでNGenを実行します
  • NGenはString.Equals呼び出しをインライン化し、メソッド呼び出し命令をメソッド内の実際のコードに置き換えます。
    メソッド呼び出しは(わずかに)費用がかかるため、頻繁に呼び出されるメソッドのパフォーマンスが向上します。

ただし、Microsoftがにセキュリティホールを見つけた場合String.Equals、単にアップデートすることはできませんmscorlib.dll。NGenしたアセンブリには影響しないためです。(それは参照せずに生のマシンコードを持っているのでString.Equals)。
それが実際に発生した場合、セキュリティ更新プログラムによってNGenストアがクリアされると思います。

この属性は.NET Frameworkアセンブリでのみ役立つことに注意してください。あなた自身でそれを必要としません。詳しくは、https//stackoverflow.com/a/14982340/631802をご覧ください。


18
この属性を独自のフレームワークで使用できますか?私のオープンソースライブラリには、
これから

3
.NETフレームワークにパッチが適用されている場合、既存のネイティブイメージファイルは無効にされて再作成されます(少なくとも私の理解です)
Motti

14
@MattDaveyいいえ、独自のコードではこの属性を使用しないでください。MSDNに書かれているように、「このAPIは.NET Frameworkインフラストラクチャをサポートし、コードから直接使用するためのものではありません。」この属性は、対象のパッチを使用するアセンブリにのみ影響します。いくつかのソースのリンクを持つ長い説明はここで見つけることができます:stackoverflow.com/a/14982340/631802
cremor

25
すべてのコードがアセンブリの境界を越えて自動的にインライン化できるという事実、つまりこの属性は完全に役に立たないということです。答えで本当に言及する必要があります...
BlueRaja-Danny Pflughoeft

4
@MattDavey可能であれば、メソッドをインライン化する必要があることをコンパイラに知らせたい場合は、[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.