我遇到了一个非常奇怪的行为,我希望有人可以对这个问题有所了解:
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指令 - 可能是因为这条指令的存在会以某种方式影响内存布局吗?