プロパティと自動プロパティに関するいくつかの質問と回答、そしてこれらがコンパイラによってどのように表現されているのかを確認した後、これを聞いています。自動プロパティのコンパイル方法は?
私が理解したところでは、自動プロパティはフィールドとして表され、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です。これは正しい結論ですか?そして最終的に、デバッガが接続されたときにフィールドがプロパティより速かったのはなぜですか?
C#を使用すると、実際には2つのコンパイル手順があります(.NETネイティブのようなものを使用していないことを前提とします)。コンパイル時にMSILを出力するC#コンパイラと、実行時にマシンコードを生成するJITコンパイラ。 JITはあなたが推測したインライン最適化を行います。また、デバッガを接続してデバッグ環境を改善するときに、最適ではないマシンコードを生成します。 –
@mikezありがとう、これは私の質問にcopletly答えませんが、それは貴重な情報です – meJustAndrew