相关疑难解决方法(0)

.NET x64中的for循环性能奇怪:偶数迭代亲和力?

运行具有大量迭代的空for循环,运行所需的时间长得非常不同:

public static class Program
{
    static void Main()
    {
        var sw = new Stopwatch();
        sw.Start();
        for (var i = 0; i < 1000000000; ++i)
        {
        }
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);
    }
}
Run Code Online (Sandbox Code Playgroud)

以上将在我的机器上运行大约200ms,但如果我将它增加到1000000001,那么它需要4倍的时间!然后,如果我将它设为1000000002,那么它再次下降到200ms!

似乎发生在偶数次迭代中.如果我去for (var i = 1; i < 1000000001,(注意从1开始而不是0)那么它是200ms.或者如果我这样做i <= 1000000001(注意小于或等于)那么它是200ms.或者(var i = 0; i < 2000000000; i += 2)也是.

这似乎只出现在x64上,但在所有.NET版本上都达到(至少)4.0.此外,它仅在处于释放模式且调试器已分离时才会出现.

更新我认为这可能是由于jit中的一些聪明的位移,但以下似乎反驳了:如果你做了类似在该循环内创建一个对象的东西,那么这也需要大约4倍的时间:

public static class Program
{
    static void Main()
    {
        var sw = …
Run Code Online (Sandbox Code Playgroud)

.net c# performance

8
推荐指数
1
解决办法
252
查看次数

标签 统计

.net ×1

c# ×1

performance ×1