在C#中循环是否以相同的速度出现在所有系统中。 如果不是,我怎样才能控制一个循环速度,使所有平台的体验一致?
您可以设置一个循环周期的最短时间,如下所示:
for(int i= 0; i < 10; i++) { System.Threading.Thread.Sleep(100); ... rest of your code... }
睡眠呼叫最少需要100ms(不能说最大值是多少),所以你的循环需要至少1秒来运行10次迭代。
请记住,它与Windows编程的正常方式在您的用户界面线程上休眠是相反的,但是这可能对您很快有用。
你永远不能依靠循环的速度。 虽然所有现有的编译器努力使循环尽可能高效,所以它们可能产生非常相似的结果(给定足够的开发时间),编译器并不是唯一影响这一点的想法。
甚至把所有的东西放在一边,不同的机器有不同的性能。 没有两台机器会产生一个循环的完全相同的速度。 实际上,即使在同一台机器上两次启动程序也会产生稍微不同的性能。 这取决于其他程序正在运行,CPU如何感觉今天,以及月亮是否闪亮。
不,循环在所有系统中都不会发生。 这个问题有很多因素,没有代码就无法回答。
这是一个简单的循环:
int j; for(int i = 0; i < 100; i++) { j = j + i; }
这个循环太简单了,它只是一对加载,添加,存储操作,跳转和比较。 这只会是几个microops,而且会非常快。 但是,这些microops的速度将取决于处理器。 如果处理器可以在十亿分之一秒(大约一千兆赫)内完成一次微操作,那么该循环大约需要6 * 100微秒(这是粗略的估计,涉及太多因素,我只是近似)或者6×100亿分之一秒,或者小于百万分之一秒。 整个循环。 你几乎可以用大多数操作系统功能来测量。
我想演示循环的速度。 我上面提到了每秒10亿个microops的处理器。 现在考虑一个处理器,可以做到每秒40亿microops。 那个处理器比第一个处理器要快四倍。 而且我们没有改变代码。
这是否回答这个问题?
对于那些想提到编译器可能循环展开的人,为了学习而忽略它。
控制这种方法的一种方法是使用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次第二。 在其他情况下,这应该工作得很好。
这种逻辑对于获得在不同系统上不会加速或减速的流畅动画是很好的。