C# For循环随机占用更多时间?

C# For循环随机占用更多时间?,c#,performance,loops,diagnostics,C#,Performance,Loops,Diagnostics,我正在测试我的代码,以查看for和foreach循环之间的性能差异(出于好奇,我想看看它是如何影响我的程序的),并且在测量滴答声时,我注意到当for循环中的列表为空时,所用的时间会有零星的跳跃 例如,控制台窗口中的一些输出读取[…]、2、4、4、2、5、4、2、26、3、1、27、2、2、1、3、2、2、[…] 虽然我意识到这些用于如此小的时间间隔测量的滴答声对我的应用程序的最终性能是疏忽的,但我很好奇为什么会有这样的跳跃。同样,这些数字是在我知道列表是空的情况下获取的,因此没有什么可以实际迭代

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

例如,控制台窗口中的一些输出读取[…]、2、4、4、2、5、4、2、26、3、1、27、2、2、1、3、2、2、[…]

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

循环中的对象是字典;具体来说,它们的键有int,值有自定义类

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");
    }
publicsvoid更新(游戏时间内)
{
watch.Restart();
对于(int i=0;i<\u movementComponents.Count;++i)
{
_positionComponents[i]。Position+=\u movementComponents[i]。速度*游戏时间;
_movementComponents[i].速度=矢量2.0;
}
看,停;
Console.WriteLine(“Loop take”+watch.ElapsedTicks+“ticks”);
}

我用一个空循环做了这样一个实验。同样的随机延迟也存在。我可以想到以下几个原因:

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

可能是垃圾收集?您在循环中操作和创建的对象是什么?我的第一个猜测是GC。特别是如果你没有使用值类型的话。滴答声的频率是非常相关的。这是纳秒级吗?微秒?可能是缓存未命中、上下文切换等。我用一个空循环做了这样的实验。在那里也会发生。例如,来自(网络)中断的背景噪声。或者高优先级线程做少量的工作。更新我的帖子以包含请求的信息@乔伊,被操纵的对象即使不是在它们上面迭代也很重要吗?你总是可以通过检查Gen 0 GC计数来检查是否调用了GC。