for循环随机需要更多的滴答?

时间:2016-06-05 21:43:51

标签: c# performance loops diagnostics

我正在测试我的代码以查看for和foreach循环之间的性能差异(想看看它是如何因为好奇而影响我的程序),并且在测量滴答声时,我注意到会有零星的跳跃在for循环中列表为空时所花费的时间。

例如,控制台窗口中的某些输出显示为[...],2,4,4,2,5,4,2, 26 ,3,1, 27 ,2,2,1,3,2,2,[...]。

虽然我意识到这么小的时间间隔测量的这些滴答对于我的应用程序的最终性能是疏忽的,但我很好奇为什么会有这样的跳跃。同样,这些数字是在我知道列表为空的时候拍摄的,所以没有什么可以实际迭代。

循环中的对象是字典;具体来说,他们为其值设置了密钥和自定义类。

Stopwatch.Frequency给了我2533211(自从我进行了之前的测量后,我没有必要重新启动系统)。

代码 -

    public void Update(int gameTime)
    {
        watch.Restart();
        for (int i = 0; i < _movementComponents.Count; ++i)
        {
            _positionComponents[i].Position += _movementComponents[i].Velocity * gameTime;
            _movementComponents[i].Velocity = Vector2.Zero;
        }
        watch.Stop();
        Console.WriteLine("Loop took " + watch.ElapsedTicks + " ticks");
    }

1 个答案:

答案 0 :(得分:1)

我做了一个空循环的实验。在那里也发现了相同的随机延迟。以下是我能想到的几个原因:

  • 中断(网络,鼠标,计时器滴答,其他进程导致的IO完成,音乐播放器,USB设备等时传输,......)
  • 高优先级线程在进入睡眠状态之前执行少量工作。我想不出任何具体的这样的线索,但我知道这是一个原因。当您将自己的线程和进程设置为实时时,延迟配置文件会被显着压缩。
  • 也许您正在触摸待机列表中的内存页面。这意味着访问时会出现软页面错误。
  • 可能会触发垃圾收集器而不是此循环。