由于构造函数参数名称不匹配,C#方法性能显着降低

时间:2018-05-05 21:28:12

标签: c# performance naming cil

我创建了一个使用回溯算法解决数独谜题的程序。为此,我创建了一个名为Tile的类,其中包含一个构造函数,该构造函数接受一个布尔标记,表示该区块是否打开以供用户输入。

/// <summary>
/// Represents a single tile in a sudoku board
/// </summary>
public class Tile
{
    public int Row { get; set; }

    public int Column { get; set; }

    public int Box { get; set; }

    public int Value { get; set; }

    public bool ReadOnly { get; private set; }

    public Tile(bool @readonly = false)
    {
        this.ReadOnly = @readonly;
    }
}

传入以下数独板需要0.03秒才能解决

                { 0, 0, 6, 0, 0, 8, 0, 9, 0 },
                { 0, 0, 3, 6, 9, 0, 0, 0, 5 },
                { 0, 0, 7, 0, 0, 4, 0, 3, 0 },

                { 0, 9, 0, 0, 0, 0, 0, 4, 0 },
                { 0, 0, 8, 0, 3, 0, 1, 0, 0 },
                { 0, 6, 0, 0, 0, 0, 0, 7, 0 },

                { 0, 1, 0, 8, 0, 0, 3, 0, 0 },
                { 4, 0, 0, 0, 6, 1, 9, 0, 0 },
                { 0, 7, 0, 2, 0, 0, 6, 0, 0 },

但是如果我改变Tile.ReadOnly属性或构造函数参数的名称以使它们不匹配(例如:prop'ReadOnly'和param'ro')那么解决同一块板需要8.63秒!

这是怎么回事?为什么变量的名称会对程序产生如此重大的影响?这是否与如何从C#转换为CIL有关?我看了两个组件,看起来以下几行是唯一不同的

public Tile(bool @readonly = false)
012E254A  in          al,dx        

VS

public Tile(bool ro = false)
00822548  push        ebp  
00822549  mov         ebp,esp

这些差异有什么意义吗? 完整源代码here

1 个答案:

答案 0 :(得分:2)

这在理论上根本不应该影响,我也不能得到显着的差异。

我认为你错了。应该有预热周期以确保完成jit编译。此外,您只需要在没有附带调试器的情况下对Release进行基准测试

更新:带有“ro”名称的版本(x64版本内置运行没有VS),完成100次执行循环并获得6.5秒执行时间,主要用于字符串连接和TileIsValid

CPU profiling