为什么Property Access比成员访问更慢

时间:2016-08-25 14:06:06

标签: c# .net

我一直在努力优化访问时间关键类的性能。当我测量时,我惊讶地发现会员访问和财产访问之间的性能存在显着差异。见下面的例子:

using System;
using System.Diagnostics;

public class ClassSample {
    public static int StaticField = 0;
    public int InstanceMember = 0;
    public int PropertyField { get; set; }
    public ClassSample() {
        PropertyField = 0;
    }
}

public class Program {
    public static void Main(string[] arg) {
        var obj = new ClassSample();
        int N = 10000000;
        Stopwatch sp = new Stopwatch();
        sp.Start();
        int total = 0;
        for (int i = 0; i < N; i++) {
            ClassSample.StaticField = i;
            total += ClassSample.StaticField;
        }
        sp.Stop();
        Console.Out.WriteLine("Static  :\t" + sp.Elapsed);
        sp.Restart();

        total = 0;
        for (int i = 0; i < N; i++) {
            obj.InstanceMember = i;
            total += obj.InstanceMember;
        }
        sp.Stop();
        Console.Out.WriteLine("Member:  \t" + sp.Elapsed);
        sp.Restart();

        total = 0;
        for (int i = 0; i < N; i++) {
            obj.PropertyField = i;
            total += obj.PropertyField;
        }
        sp.Stop();
        Console.Out.WriteLine("Property:\t" + sp.Elapsed);
    }
}

我运行这个(.Net 4.5 / Windows 10),我得到了这些结果:

Static  :       00:00:00.0243832
Member:         00:00:00.0240386 
Property:       00:00:00.0624915

因此,Property访问速度比其他访问速度慢两倍。这是预期的吗?有什么方法可以避免它吗?

3 个答案:

答案 0 :(得分:3)

我也经历过这种情况,但我后来发现,如果你正确地优化你的Release目标,编译器会优化Property访问,使其性能与成员访问相同。尝试一下并运行Release目标,您应该会看到明显的改进。似乎大多数差异主要与在Debug中运行有关。

答案 1 :(得分:1)

属性基本上是特殊方法。调用方法比读取字段的值有更多的开销。

您是否在调试模式下构建了性能测试?在Release模式下构建时,编译器会内联琐碎的属性getter / setter,并且应该使属性与字段大致相同。

答案 2 :(得分:0)

int Property{get; set;}

相同
private int property; 
public int GetProperty(){...} 
public void SetProperty(int value){...}

我猜测方法开销会让它变慢。