C#はプロパティへのインラインアクセスですか?私はインライン化のためにJITの32バイト(命令?)制限を認識していますが、それはインラインプロパティか、の純粋なメソッド呼び出しですか?C#のインラインプロパティはありますか?
答えて
JIT(C#コンパイラは私が知っている限りインライン展開をしません)までありますが、ほとんどの場合、JITはインラインで些細な特性を持つと信じています。
それはがタイプのインライン部材(System.ComponentModel.Component
介して)System.Windows.Forms.Control
を含むMarshalByRefObject
に由来しないことに注意してください。
私はまた、double
フィールドがプロパティを介してアクセスされたときに効率が悪くなるのを見たことがあります。それは(レジスタの使用などのために)その周りに微妙なものがある可能性があります。
また、64ビットと32ビットのJITは、インライン化されたものの扱いを含めて異なります。
編集:私はちょうどより多くの情報とDavid Notarioによって2004 blog entryを見つけました。しかし、それは2.0出荷前であった - 私は少なくともそれのが今変更されていることを見て驚くことはありません。とにかく興味があるかもしれません。
編集:Another questionは、2008 Vance Morrison blog entryと呼ばれ、より多くの情報を示します。興味深いもの。
プロパティアクセスは、純粋なメソッド呼び出しです。コンパイラがプロパティへのアクセスと、同様のシグネチャを持つメソッド呼び出しのために発行するILには違いはありません。これはあなたの質問の答えです。
私は一般的な原則に同意しますが、*プロパティ*側にILの違いがあります... JITは、呼び出されているものがプロパティメンバーであることを確かに "知る"ことができます。 JITはその情報に基づいています。しかし、それを行うことはかなり奇妙である、IMO。 –
はい、アクセサメソッドは 'specialname'フラグでマークされ、その名前は標準化されています。OTOHでは、CLR(コンストラクタのような)から特別な扱いを受けるメソッドには 'rtspecialname'というマークが付いているため、アクセッサの扱いがCLI/CLR標準の精神に反します。 –
Visual Studioでは、の後にマネージコードの逆アセンブリを表示することができます。JITがコンパイルします。
非常に単純なアクセサプロパティを持つクラスを作成し、リリースモードで実行し、ブレークポイントを設定し、逆アセンブリが何を表示するのかを確認してください。
あなたが(あなたが言うように)あなたがそれを理解するためにあなたをしばらく取ったならば、それをどうやって行うのか教えてください。 –
コードをステップインまたは分割して、逆アセンブリウィンドウを開きます。 –
デバッガでリリースモードコードを実行すると、デバッガでリリースモードコードを実行すると、JIT最適化が無効になる可能性があります。その代わりに、デバッガなしで起動し、JITとし、デバッガを使用して実行中のプロセスにアタッチしてから、逆アセンブリウィンドウを開きます。 – ChrisW
私は最近、同様の質問を投稿:
Why are public fields faster than properties?
問題を鉱山では、私は64ビットVistaを実行していることだし、JITが私のコードにコンパイルされているため、パブリックフィールドが速くプロパティよりだったということでした64ビットであっても、私のプロパティはではなく、が並んでいます。 x86用にプロジェクトを強制的にコンパイルすると、プロパティがインライン化され、プロパティとパブリックフィールドの間に速度の差はありませんでした。
したがって、C#32ビットJITはインラインプロパティを実行し、64ビットはその他の非静的メソッドも実行しません。
- 1. ungetcのC++バージョンはありますか?
- 2. Cのクロスプラットフォームフレームワークはありますか?
- 3. CのBigDecimalクラスはありますか?
- 4. C#のGuavaはありますか?
- 5. ありますか:C#リテラルライブラリ
- 6. C++レイジーポインタはありますか?
- 7. C++アルマナックはありますか?
- 8. SFTPコミュニケーションはC#にありますか?
- 9. C#、.netニュースアグリゲータはありますか?
- 10. C#/ asp.netセキュリティライブラリはありますか?
- 11. コードCまたはC++はありますか?
- 12. Pythonにはモジュールがありますが、C++には何がありますか?
- 13. Windowsのルート情報にC/C++ APIはありますか?
- 14. C/C++ printfs - Androidのネイティブコードはどこにありますか?
- 15. コンポーネントサービスCOM + C#あまり正しくないものはありますか?
- 16. Java用のCocoaまたはObjective C APIはありますか?
- 17. C#webformのSolrNet DemoAppまたはオープンソースアプリはありますか?
- 18. C++ std :: partial_sortに相当するC#はありますか?
- 19. extern "C"はC言語で効果がありますか?
- 20. C/C++のC#のPrintDocumentと同等の機能はありますか?
- 21. C用の3Dビジュアライゼーションライブラリまたはツールキットはありますか? (No C++ please!)
- 22. C++で書かれたオープンソースのPDFプリンタはありますか?
- 23. C/C++の行をうまくラップする自動ソースコードフォーマッタはありますか?
- 24. 3DチャートのC++にはオープンソースライブラリはありますか?
- 25. Frama-C Windowsバイナリがありますか?
- 26. C#用のオープンソース不変ディクショナリはありますか?高速 'With/Without'メソッドはありますか?
- 27. C#のバンドルのようなものはありますか?
- 28. Rubyの `respond_to?`に相当するC#はありますか?
- 29. JavaのFile.separatorに相当するC#はありますか
- 30. C#:JTableに相当するものはありますか?
値は、1つまたは2つの関数(get_Name、set_Name)のラッパーです。したがって、プロパティインライン化は関数インライン化に対して最小限の拡張です。 – Richard