什么是“紧密循环”?

时间:2010-02-06 11:50:17

标签: terminology

我经常听到这句话。这是什么意思?

一个例子会有所帮助。

8 个答案:

答案 0 :(得分:43)

来自Wiktionary

  1. (计算)在汇编语言中,循环包含很少的指令并多次迭代。
  2. (计算)这种大量使用I / O或处理资源的循环,无法与操作系统中运行的其他程序充分共享。
  3. 对于案例1,它可能就像

    for (unsigned int i = 0; i < 0xffffffff; ++ i) {}
    

答案 1 :(得分:27)

我认为这个短语通常用于指定一个循环,它循环多次,并且会对程序的性能产生严重影响 - 也就是说,它可以使用大量的CPU周期。通常你会在讨论优化时听到这句话。

例如,我想到了游戏,一个循环可能需要处理屏幕上的每个像素,或科学应用程序,其中一个循环正在处理巨大的数据点数组中的条目。

答案 2 :(得分:8)

视频Jon Skeet and Tony the Pony中有一个紧凑循环(〜无限循环)的好例子。

示例是:

while(text.IndexOf("  ") != -1) text = text.Replace("  ", " ");

产生紧密循环,因为IndexOf忽略Unicode零宽度字符(因此找到两个相邻的空格),但Replace不会忽略它们(因此不会替换任何相邻的空格)。

其他答案中已有很好的定义,所以我不再提及它们了。

答案 3 :(得分:5)

紧密循环是一种对CPU缓存友好的循环。它是一个适合指令缓存的循环,它不进行分支,并且有效地隐藏了正在处理的数据的内存提取延迟。

答案 4 :(得分:3)

SandeepJ的答案是在处理数据包的网络设备(例如,参见中间盒上的维基百科条目)的上下文中的正确答案。我想补充一点,运行紧密循环的线程/任务尝试在单个CPU上保持调度,而不是将上下文切换出来。

答案 5 :(得分:2)

根据韦伯斯特的字典,“在不向其他程序或操作系统释放任何资源的情况下执行的代码循环。”

http://www.websters-online-dictionary.org/ti/tight+loop.html

答案 6 :(得分:1)

根据经验,我注意到,如果你试图做一个无限期运行的循环,例如:

while(true)
{
    //do some processing
}

这样的循环很可能始终是资源密集型的。如果你通过这个循环检查进程的CPU和内存使用情况,你会发现它会被激活。这就是有些人称之为“紧密循环”的想法。

答案 7 :(得分:0)

如今,许多编程环境都不会使程序员处于需要紧密循环的条件下,例如Java Web服务在调用代码的容器中运行,因此您需要最小化/消除Servlet实现中的循环。诸如Node.js之类的系统会处理紧密循环,同样,您应该在自己的代码中最小化/消除循环。它们用于您完全控制程序执行的情况,例如操作系统或实时/嵌入式环境。对于OS,您可以将CPU处于空闲状态视为它在紧密循环中所花费的时间,因为紧密循环是执行检查是否需要运行其他进程或是否存在该进程的地方是需要服务的队列,因此,如果没有需要运行的进程且队列为空,则CPU只是在紧密循环中发呆,这在理论上表明了CPU的“不忙”程度。紧密循环应设计为仅执行检查,因此它就像if .. then语句的一大列表,因此在Assembly中它将简化为COMPARE操作数,然后分解为分支,因此非常高效。当所有检查都导致不分支时,紧密循环每秒可以执行数百万次。操作系统/嵌入式系统通常会对CPU占用进行某种检测,以处理某些进程没有放弃对CPU的控制的情况-可以在紧密循环中检查此类事件的发生。最终,您需要了解某个程序需要在某个时候进行循环,否则您将无法对CPU进行任何有用的操作,因此,如果您从未发现需要进行循环,那是因为您的环境为您处理了所有这一切。 CPU一直在执行指令,直到没有剩余的执行空间,否则您将崩溃,因此OS之类的程序必须具有紧密的循环才能真正起作用,否则它将只运行几微秒。