C# For循环随机占用更多时间?
我正在测试我的代码,以查看for和foreach循环之间的性能差异(出于好奇,我想看看它是如何影响我的程序的),并且在测量滴答声时,我注意到当for循环中的列表为空时,所用的时间会有零星的跳跃 例如,控制台窗口中的一些输出读取[…]、2、4、4、2、5、4、2、26、3、1、27、2、2、1、3、2、2、[…] 虽然我意识到这些用于如此小的时间间隔测量的滴答声对我的应用程序的最终性能是疏忽的,但我很好奇为什么会有这样的跳跃。同样,这些数字是在我知道列表是空的情况下获取的,因此没有什么可以实际迭代的 循环中的对象是字典;具体来说,它们的键有int,值有自定义类 Stopwatch.Frequency给了我2533211(自从我做了之前的测量之后,我就没有重新启动过我的系统) 代码-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、[…] 虽然我意识到这些用于如此小的时间间隔测量的滴答声对我的应用程序的最终性能是疏忽的,但我很好奇为什么会有这样的跳跃。同样,这些数字是在我知道列表是空的情况下获取的,因此没有什么可以实际迭代
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设备等时传输等)
- 高优先级线程在睡觉前做少量的工作。我想不出任何具体的线索,但我知道这是一个原因。当您将自己的线程和进程设置为实时时,延迟配置文件将显著压缩
- 可能您正在触摸待机列表中的内存页。这意味着访问时发生软页面错误
- 垃圾收集器可能会被触发,而不是此循环