当方法中存在Ldloca指令时性能受到影响

时间:2014-10-13 23:37:51

标签: c# .net performance optimization cil

我遇到了一个非常奇怪的行为,我希望有人可以对这个问题有所了解:

class Sample
{
    public static void Main()
    {
        const int COUNT = 10000000;
        while (true)
        {
            // move allocation here to allocate more often so more probably to get 50x slowdown problem
            var stopwatch = Stopwatch.StartNew();
            var total = 0;
            for (int i = 1; i <= COUNT; ++i)
            {
                total += i;
            }
            Console.Write("{0}, ", stopwatch.ElapsedMilliseconds);
            if (total > total + 1)
                Console.WriteLine(((object)total).ToString());
        }
    }
}

注意最后一行中的对象转换(顺便说一下,它永远不会运行)。如果没有它,代码将获得相当大的性能 - 在我的MacBook Pro 15“2012版本中运行带有.NET 4.5的Windows 7,它增加了16ms的开销,而总变量为int时没有开销的运行时间是3ms,如果它是双倍,则为11ms。

我在ILDASM中看到的唯一区别似乎是添加了Ldloca指令 - 可能是因为这条指令的存在会以某种方式影响内存布局吗?

0 个答案:

没有答案