C# 为什么属性访问比成员访问慢

C# 为什么属性访问比成员访问慢,c#,.net,C#,.net,我一直在努力优化访问时间关键类的性能。当我进行测量时,我惊讶地发现成员访问和属性访问在性能上存在显著差异。见下例: using System; using System.Diagnostics; public class ClassSample { public static int StaticField = 0; public int InstanceMember = 0; public int PropertyField { get; set; } pub

我一直在努力优化访问时间关键类的性能。当我进行测量时,我惊讶地发现成员访问和属性访问在性能上存在显著差异。见下例:

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);
    }
}

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

我也经历过这种情况,但后来我发现,如果您正确优化了发布目标,那么编译器会优化属性访问,使其性能与成员访问相同。尝试一下并运行发布目标,您应该会看到显著的改进。看起来,大部分差异主要与在调试中运行有关

int Property{get; set;}

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

我猜方法开销会使它变慢。

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


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

请先阅读。我无法重现您的结果。要么你的系统发生了一些奇怪的事情,要么你错过了一些明显的事情,比如在调试模式下测试或者附加了调试器。是的。在发布模式下运行时效果良好。您认为速度减慢的主要原因是因为它是作为调试运行的还是因为它是从Visual Studio运行的?这是调试设置的开销。VS以调试的方式运行一切。您需要从IDE外部运行它。真棒:当我在优化的发布模式下运行它时,性能差异消失了:静态:00:00:00.0046212成员:00:00:00.0046740属性:00:00:00.0046747
private int property; 
public int GetProperty(){...} 
public void SetProperty(int value){...}