【发布时间】:2016-06-05 21:43:51
【问题描述】:
我正在测试我的代码以查看 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");
}
【问题讨论】:
-
垃圾回收可能吗?
-
您在循环中操作和创建的对象是什么?我的第一个猜测是GC。特别是如果你没有在那里使用值类型。
-
刻度的频率非常相关。这是纳秒级吗?微秒?可能是缓存未命中、上下文切换等。
-
我用 empty 循环做了一个这样的实验。那里也发生。例如,来自(网络)中断的背景噪音。或者做少量工作的高优先级线程。
-
更新了我的帖子以包含请求的信息; @Joey,即使没有迭代它们,被操纵的对象也会很重要吗?
标签: c# performance loops diagnostics