代码之家  ›  专栏  ›  技术社区  ›  Vishnu Pradeep

所有系统的循环速度是否相同?

  •  3
  • Vishnu Pradeep  · 技术社区  · 14 年前

    所有系统的循环速度是否相同。如果没有,我如何控制循环速度,使所有平台上的体验一致?

    4 回复  |  直到 8 年前
        1
  •  9
  •   Will Dean    14 年前

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

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

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

        2
  •  7
  •   Konrad Rudolph    14 年前

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

    即使抛开其他一切,不同的机器也有不同的性能。没有两台机器能产生完全相同的速度。事实上,即使在同一台机器上启动两次程序,也会产生稍有不同的性能。这取决于其他程序在运行,CPU今天的感觉如何,月亮是否发光。

        3
  •  6
  •   jcolebrand    14 年前

    这是一个简单的循环:

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

    这个循环太简单了,它只是一对加载、添加、存储操作,带有一个跳转和一个比较。这将只是几个微操作,并将非常快。然而,这些微操作的速度将取决于处理器。如果处理器可以在1×第十亿秒(大约1千兆赫兹)中执行一个微操作,那么循环将花费大约6×100个微操作(这都是粗略估计,涉及到的因素很多,我只需要近似)或6×100亿分之一秒,或者略小于一百万分之一秒。整个循环。在大多数操作系统功能中,您几乎无法衡量这一点。

    我想演示一下循环的速度。我在上面提到一个每秒10亿微操作的处理器。现在考虑一个每秒能做40亿次微操作的处理器。这个处理器的速度大约是第一个处理器的四倍。我们没有改变密码。

    这能回答问题吗?

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

        4
  •  2
  •   Øyvind Bråthen    14 年前

    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次。在其他情况下,这应该工作得很好。