什么是"紧密循环"?

Fre*_*ool 65 terminology

我听过很多这句话.这是什么意思?

一个例子会有所帮助.

ken*_*ytm 46

来自维基词典:

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

对于案例1,它可能就像

for (unsigned int i = 0; i < 0xffffffff; ++ i) {}
Run Code Online (Sandbox Code Playgroud)

  • 1)这个例子不是一个紧凑的循环,它是一个NOP :) 2)我从来没有在生活中看到过这个含义.这听起来更像是"资源匮乏" (3认同)
  • 具有一些智能(ish)优化的智能(ish)编译器将摆脱它。 (2认同)

Ray*_*Ray 27

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

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

  • 经常执行的代码的一部分可能是优化的良好候选者,但它通常不是紧密循环.即使它经常被调用 - 如果调用通过几层函数和对象发生,它也不是"紧".循环条件和循环指令需要彼此非常紧密,代码在同一个文件中,相同的几行代表"紧密循环". (2认同)

And*_*Dog 9

在视频Jon Skeet和Tony the Pony中有一个很好的紧环(〜无限循环)的例子.

例子是:

while(text.IndexOf("  ") != -1) text = text.Replace("  ", " ");
Run Code Online (Sandbox Code Playgroud)

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

其他答案中已经有了很好的定义,所以我再也没有提到它们.


小智 6

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


小智 5

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