2009-03-14 7 views
12

C#はプロパティへのインラインアクセスですか?私はインライン化のためにJITの32バイト(命令?)制限を認識していますが、それはインラインプロパティか、の純粋なメソッド呼び出しですか?C#のインラインプロパティはありますか?

答えて

24

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と呼ばれ、より多くの情報を示します。興味深いもの。

+0

値は、1つまたは2つの関数(get_Name、set_Name)のラッパーです。したがって、プロパティインライン化は関数インライン化に対して最小限の拡張です。 – Richard

8

プロパティアクセスは、純粋なメソッド呼び出しです。コンパイラがプロパティへのアクセスと、同様のシグネチャを持つメソッド呼び出しのために発行するILには違いはありません。これはあなたの質問の答えです。

+0

私は一般的な原則に同意しますが、*プロパティ*側にILの違いがあります... JITは、呼び出されているものがプロパティメンバーであることを確かに "知る"ことができます。 JITはその情報に基づいています。しかし、それを行うことはかなり奇妙である、IMO。 –

+0

はい、アクセサメソッドは 'specialname'フラグでマークされ、その名前は標準化されています。OTOHでは、CLR(コンストラクタのような)から特別な扱いを受けるメソッドには 'rtspecialname'というマークが付いているため、アクセッサの扱いがCLI/CLR標準の精神に反します。 –

5

Visual Studioでは、の後にマネージコードの逆アセンブリを表示することができます。JITがコンパイルします。

非常に単純なアクセサプロパティを持つクラスを作成し、リリースモードで実行し、ブレークポイントを設定し、逆アセンブリが何を表示するのかを確認してください。

+3

あなたが(あなたが言うように)あなたがそれを理解するためにあなたをしばらく取ったならば、それをどうやって行うのか教えてください。 –

+0

コードをステップインまたは分割して、逆アセンブリウィンドウを開きます。 –

+6

デバッガでリリースモードコードを実行すると、デバッガでリリースモードコードを実行すると、JIT最適化が無効になる可能性があります。その代わりに、デバッガなしで起動し、JITとし、デバッガを使用して実行中のプロセスにアタッチしてから、逆アセンブリウィンドウを開きます。 – ChrisW

4

私は最近、同様の質問を投稿:

Why are public fields faster than properties?

問題を鉱山では、私は64ビットVistaを実行していることだし、JITが私のコードにコンパイルされているため、パブリックフィールドが速くプロパティよりだったということでした64ビットであっても、私のプロパティはではなく、が並んでいます。 x86用にプロジェクトを強制的にコンパイルすると、プロパティがインライン化され、プロパティとパブリックフィールドの間に速度の差はありませんでした。

したがって、C#32ビットJITはインラインプロパティを実行し、64ビットはその他の非静的メソッドも実行しません。

関連する問題