什么是“紧密循环”?


77

我听到过很多话。这是什么意思?

一个例子会有所帮助。


您在其中阅读的内容可以帮助我们理解您的问题。您能否提供报价,链接或提示?
S.Lott

1
我刚刚听说它在办公室里被绑架了。我没有注册上下文。我想我对继续进行这么多的绑架感到有点生气。
Frederick The Fool,2010年

1
可能是办公室里的人只是随意散布流行语。或不。您可以问他们是什么意思。
S.Lott

Answers:


52

来自维基词典

  1. (计算)在汇编语言中,是一个循环,其中包含很少的指令,并且循环多次。
  2. (计算)这样的循环会大量使用I / O或处理资源,而无法与操作系统中运行的其他程序充分共享这些资源。

对于情况1,可能就像

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

5
1)这个例子不是一个紧密的循环,而是一个NOP :) 2)我一生中从未见过这种含义。这听起来更像是一个“吃资源”
卡罗利·霍瓦斯

2
一个具有某些智能(ish)优化的智能(ish)编译器将摆脱它。
djh

1
继续以上评论,是不是while (condition == false) {}更好的例子?
jdrd

我认为这种循环,甚至发布的@jdrd都将使用一个CPU内核的全部性能。人们为什么使用它?
MinhNghĩa'5

31

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

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


4
经常执行的部分代码可能是优化的良好候选者,但是通常这并不是一个紧密的循环。即使它经常被调用-如果调用是通过多层函数和对象进行的,它也不是“紧密的”。循环条件和循环指令必须彼此紧密结合,在同一文件中编码,并为“紧密循环”使用相同的几行代码。
foo

我听说答案中描述的这种循环称为程序中的“热点”,这是有针对性的优化将获得回报的地方。因此,Sun将其自适应的配置文件驱动的即时编译技术命名为“ HotSpot”。
杰弗里·汉汀

1
@foo:它们根本不必在同一文件中。现代编译器可以轻松地将抽象层消除为零...(例如:C ++模板)
Karoly Horvath 2015年

13

视频Jon Skeet和Tony the Pony中有一个很好的例子,它表现为紧密循环(〜无限循环)。

示例是:

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

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

其他答案中已经有好的定义,所以我不再赘述。


10

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


5

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



2

从经验中,我注意到,如果您尝试做一个无限期运行的循环,例如:

while(true)
{
    //do some processing
}

这样的循环很可能总是占用大量资源。如果通过此循环在进程中检查CPU和内存使用情况,您会发现它会急剧增加。有人将这种想法称为“紧密循环”。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.