对于所有系统,循环是否以相同的速度发生?

时间:2010-11-04 14:27:35

标签: c# .net windows loops mono

对于所有系统,C#中的循环是否以相同的速度发生。如果没有,我如何控制循环速度以使所有平台上的体验保持一致?

4 个答案:

答案 0 :(得分:9)

您可以设置循环所用时间的最短时间,如下所示:

for(int i= 0; i < 10; i++)
{
   System.Threading.Thread.Sleep(100);
   ... rest of your code...
}

睡眠调用至少需要100ms(你不能说最大值是多少),所以你的循环至少需要1秒才能运行10次迭代。

请记住,这与Windows编程在用户界面线程上睡眠的正常方式背道而驰,但这可能对您进行快速黑客攻击很有用。

答案 1 :(得分:7)

你永远不能依赖循环的速度。虽然所有现有的编译器都努力使循环尽可能高效,因此它们可能产生非常相似的结果(给定足够的开发时间),编译器并不是影响它的唯一思考。

即使把所有其他东西放在一边,不同的机器也有不同的性能。没有两台机器可以为循环产生完全相同的速度。实际上,即使在同一台机器上启动程序两次,也会产生略微不同的性能。这取决于其他程序正在运行,CPU今天的感觉以及月亮是否闪亮。

答案 2 :(得分:6)

不,所有系统中的循环都不会相同。这个问题有很多因素,没有代码就无法回答。

这是一个简单的循环:

int j;
for(int i = 0; i < 100; i++) {
  j = j + i;
}

这个循环太简单了,它只是一对加载,添加,存储操作,跳转和比较。这将只有几个microops,并且会非常快。但是,那些微控制器的速度将取决于处理器。如果处理器可以在10亿分之一秒(大约1千兆赫兹)内完成一个微操作,那么环路将需要大约6 * 100微安(这是所有粗略估计,涉及的因素很多,我只是为了近似)或6 * 100十亿分之一秒,或略低于百万分之一秒。对于整个循环。大多数操作系统功能都无法衡量这一点。

我想证明循环的速度。我在上面引用了每秒10亿微秒的处理器。现在考虑一个每秒可以达到40亿微秒的处理器。该处理器比第一个处理器快四倍(大致)。我们没有改变代码。

这是否回答了这个问题?

对于那些想要提及编译器可能循环展开这个的人,请为了学习而忽略它。

答案 3 :(得分:2)

控制此方法的一种方法是使用Stopwatch来控制何时执行逻辑。请参阅此示例代码:

int noofrunspersecond = 30;
long ticks1 = 0;
long ticks2 = 0;
double interval = (double)Stopwatch.Frequency / noofrunspersecond;
while (true) {
  ticks2 = Stopwatch.GetTimestamp();
  if (ticks2 >= ticks1 + interval) {
    ticks1 = Stopwatch.GetTimestamp();
    //perform your logic here
  }
  Thread.Sleep(1);
}

这将确保只要系统能够跟上,就以给定的间隔执行逻辑,因此如果您尝试每秒执行100次,则根据执行的逻辑,系统可能无法执行该逻辑每秒100次。在其他情况下,这应该可以正常工作。

这种逻辑有助于获得平滑的动画,例如在不同的系统上不会加速或减速。