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

For loop randomly takes more ticks?

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

例如,控制台 window 中的一些输出显示 [...], 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");
    }

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

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