使用属性和性能

Grz*_*nio 15 .net c# optimization performance

我正在优化我的代码,我注意到使用属性(甚至是自动属性)会对执行时间产生深远的影响.请参阅以下示例:

[Test]
public void GetterVsField()
{
    PropertyTest propertyTest = new PropertyTest();
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    propertyTest.LoopUsingCopy();
    Console.WriteLine("Using copy: " + stopwatch.ElapsedMilliseconds / 1000.0);

    stopwatch.Restart();
    propertyTest.LoopUsingGetter();
    Console.WriteLine("Using getter: " + stopwatch.ElapsedMilliseconds / 1000.0);
    stopwatch.Restart();
    propertyTest.LoopUsingField();
    Console.WriteLine("Using field: " + stopwatch.ElapsedMilliseconds / 1000.0);
}

public class PropertyTest
{
    public PropertyTest()
    {
        NumRepet = 100000000;
        _numRepet = NumRepet;
    }

    int NumRepet { get; set; }
    private int _numRepet;
    public int LoopUsingGetter()
    {
        int dummy = 314;
        for (int i = 0; i < NumRepet; i++)
        {
            dummy++;
        }
        return dummy;
    }

    public int LoopUsingCopy()
    {
        int numRepetCopy = NumRepet;
        int dummy = 314;
        for (int i = 0; i < numRepetCopy; i++)
        {
            dummy++;
        }
        return dummy;
    }

    public int LoopUsingField()
    {
        int dummy = 314;
        for (int i = 0; i < _numRepet; i++)
        {
            dummy++;
        }
        return dummy;
    }
}
Run Code Online (Sandbox Code Playgroud)

Release我的机器模式中,我得到:

Using copy: 0.029
Using getter: 0.054
Using field: 0.026 
Run Code Online (Sandbox Code Playgroud)

在我的情况下是一个灾难 - 如果我想获得最大的性能,最关键的循环就不能使用任何属性.

我在这做错了什么?我以为这些都是inlinedJIT optimizer.

Aik*_*Aik -1

您必须检查优化代码复选框是否已选中。

  1. 如果不勾选,访问属性仍然是方法调用
  2. 如果选中,则属性是内联的,并且性能与直接字段访问相同,因为 JIT 代码将相同

X64 JIT 编译器中对 inlinig 有更多限制。有关 JIT64 内联优化的更多信息如下: David Broman 的 CLR Profiling API 博客:Tail call JIT Conditions

请看点#3 The caller or callee return a value type。如果您的属性将返回引用类型,则属性 getter 将被内联。这意味着该属性int NumRepet { get; set; }未内联,但object NumRepet { get; set; }如果您不违反其他限制,该属性将会内联。

X64 JIT 的优化很差,这就是为什么会像 John 提到的那样引入新的