2016-07-11 4 views
0

プロパティと自動プロパティに関するいくつかの質問と回答、そしてこれらがコンパイラによってどのように表現されているのかを確認した後、これを聞いています。自動プロパティのコンパイル方法は?

私が理解したところでは、自動プロパティはフィールドとして表され、getterとsetterという2つのメソッドがあります。この場合、フィールドが使用されている場合、そのフィールドにアクセスするコードは、プロパティへのアクセスよりも速くなければなりません。なぜなら、メソッドに対するsuplimentar呼び出しを避けるからです。この理論を証明するために、私は次のコードを書いていた、そして、それがどのように見えるかについては、私に言い訳してください:

それは10M回フィールドを呼び出すことで構成されてい
public class A 
{ 
    public int Prop { get; set; } 
    public int Field; 

    public A() 
    { 
     Prop = 1; 
     Field = 1; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     List<long> propertyExecutionTimes = new List<long>(); 
     List<long> fieldExecutionTimes = new List<long>(); 

     A a = new A(); 
     int aux; 
     for (int j = 0; j < 100; j++) 
     { 
      var watch = System.Diagnostics.Stopwatch.StartNew(); 
      for (int i = 0; i < 10000000; i++) 
      { 
       aux = a.Prop; 
       a.Prop = aux; 
      } 
      watch.Stop(); 

      propertyExecutionTimes.Add(watch.ElapsedMilliseconds); 

      watch = System.Diagnostics.Stopwatch.StartNew(); 
      for (int i = 0; i < 10000000; i++) 
      { 
       aux = a.Field; 
       a.Field = aux; 
      } 
      watch.Stop(); 

      fieldExecutionTimes.Add(watch.ElapsedMilliseconds); 
     } 
     Console.WriteLine("Property best time: " + propertyExecutionTimes.OrderBy(x => x).First()); 
     Console.WriteLine("Field best time: " + fieldExecutionTimes.OrderBy(x => x).First()); 

     Console.ReadKey(); 
    } 
} 

、プロパティeverthing 10回1000万回を呼び出し対し、各テストから最も低い値が選択されます。 VS2012リリース版の結果は次のとおりです。

Property best time: 96 
Field best time: 45 

期待どおり、フィールドの結果はプロパティよりもかなり優れていました。この後

しかし、私は、デバッガせずにプログラムをrunned(単に.exeファイルを実行)し、私にとっては驚きで、時間は使用してフィールドと、このような性質の両方に類似していた:

Property best time: 20 
Field best time: 20 

この場合、プロパティとフィールドの使用の違いはありませんでした。この場合、同じ場合にコンパイルされるか、プロパティのメソッドがC++のinlineメソッドと似ています。尊重するいくつかの変更を持つプロパティに対してこれをテスト

private int _field; 
public int Get() { return _field; } 
public void Set(int value) { _field = value; } 

類似:これは私が私が実際にゲッターとセッターはプロパティにcopared働いているので、私はゲッターとセッターのペアを追加しているかを確認すべきだと思う製同じ動作:

Property best time: 96 
Methods best time: 96 
デバッガで

と::

aux = a.Get(); 
a.Set(aux); 

は私にこの出力を与えました
Property best time: 20 
Methods best time: 20 

デバッガなし。これらの値は同じなので、自動プロパティはフィールドのようにコンパイルされたgetterとsetterです。これは正しい結論ですか?そして最終的に、デバッガが接続されたときにフィールドがプロパティより速かったのはなぜですか?

+1

C#を使用すると、実際には2つのコンパイル手順があります(.NETネイティブのようなものを使用していないことを前提とします)。コンパイル時にMSILを出力するC#コンパイラと、実行時にマシンコードを生成するJITコンパイラ。 JITはあなたが推測したインライン最適化を行います。また、デバッガを接続してデバッグ環境を改善するときに、最適ではないマシンコードを生成します。 –

+0

@mikezありがとう、これは私の質問にcopletly答えませんが、それは貴重な情報です – meJustAndrew

答えて

1

これらの値は同じなので、自動プロパティはフィールドと同様にコンパイルされたゲッタとセッタであると結論づけました。

はい、自動プロパティはフィールドとして実装され、getとオプションとしてそのフィールドのアクセサを設定します。

これは正しい結論ですか?

間違った理由で、はい。 :)自動プロパティがどのように実装されているかを正確に確認するには、タイミングに頼るのではなく、プログラムやライブラリを作成してMSIL逆アセンブラで開きます。あなたが見たように、タイミングの結果は誤解を招く可能性があります。

最終的に、なぜフィールドがデバッガが接続されたときのプロパティよりも速かったのですか?主にそれがプロパティアクセサが早くなりますインライン化だ

デバッグ時にインライン化が継続編集を-と-、ブレークポイントを設定してサポートすることがより困難にするので、インライン化のようなもののためにはるかに少ない機会がなど、があります直接フィールドアクセスとして。

+0

私は今まで私はバイナリファイルを分解しなかったことを認めなければならないので、それは時間がかかりました。最初に、リリースモードでdllビルドを逆アセンブルしていたので、多くのことはわかりませんでしたが、Debugでバージョンを試したところ、私は驚いていました。全体の構造がどのように保持されているかを確認することができました。答えをありがとう、それは私がもう少し働くことができましたが、それは価値がありました。良い一日を過ごしてください! – meJustAndrew

関連する問題