对于所有系统,C#中的循环是否以相同的速度发生。如果没有,我如何控制循环速度以使所有平台上的体验保持一致?
答案 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次。在其他情况下,这应该可以正常工作。
这种逻辑有助于获得平滑的动画,例如在不同的系统上不会加速或减速。