【发布时间】:2011-01-13 20:29:30
【问题描述】:
这句话我听过很多次。什么意思?
举个例子会有所帮助。
【问题讨论】:
标签: terminology
这句话我听过很多次。什么意思?
举个例子会有所帮助。
【问题讨论】:
标签: terminology
来自Wiktionary:
对于案例 1,它可能是这样的
for (unsigned int i = 0; i < 0xffffffff; ++ i) {}
【讨论】:
while (condition == false) {}不是更好的例子吗?
我认为该短语通常用于指定一个循环多次迭代,并且会对程序的性能产生严重影响——也就是说,它可以使用大量的 CPU 周期。通常你会在讨论优化时听到这个短语。
例如,我想到了游戏,其中可能需要循环处理屏幕上的每个像素,或者科学应用程序,其中循环正在处理巨型数据点数组中的条目。
【讨论】:
视频Jon Skeet and Tony the Pony中有一个很好的紧密循环(~无限循环)的例子。
例子是:
while(text.IndexOf(" ") != -1) text = text.Replace(" ", " ");
这会产生一个紧密的循环,因为IndexOf 会忽略 Unicode 零宽度字符(因此会找到两个相邻的空格),但 Replace 不会忽略它们(因此不会替换任何相邻的空格)。
其他答案中已经有很好的定义了,不再赘述。
【讨论】:
紧密循环是 CPU 缓存友好的循环。这是一个适合指令缓存的循环,它不进行分支,并且有效地隐藏了正在处理的数据的内存获取延迟。
【讨论】:
SandeepJ 的答案在处理数据包的网络设备(例如,请参阅中间盒上的维基百科条目)的上下文中是正确的。我想补充一点,运行紧密循环的线程/任务会尝试在单个 CPU 上保持调度,而不是切换上下文。
【讨论】:
根据韦伯斯特词典,“在执行时不向其他程序或操作系统释放任何资源的代码循环。”
http://www.websters-online-dictionary.org/ti/tight+loop.html
【讨论】:
根据经验,我注意到,如果您尝试做一个无限期运行的循环,例如:
while(true)
{
//do some processing
}
这样的循环很可能总是占用大量资源。如果您使用此循环检查进程的 CPU 和内存使用情况,您会发现它会猛增。这就是一些人所说的“紧密循环”的想法。
【讨论】:
现在的许多编程环境不会让程序员接触到需要紧密循环的条件,例如Java Web 服务在调用您的代码的容器中运行,您需要最小化/消除 servlet 实现中的循环。像 Node.js 这样的系统处理紧密循环,您应该再次在自己的代码中最小化/消除循环。它们用于您可以完全控制程序执行的情况,例如操作系统或实时/嵌入式环境。在操作系统的情况下,您可以将 CPU 处于空闲状态视为它在紧密循环中花费的时间量,因为紧密循环是它执行检查以查看其他进程是否需要运行或是否存在是需要服务的队列,所以如果没有需要运行的进程并且队列是空的,那么 CPU 只是在紧密循环中旋转,这会产生 CPU 有多“不忙”的概念指示。紧密循环应设计为仅执行检查,因此它就像一个 if .. then 语句的大列表,因此在汇编中它将归结为一个比较操作数,然后是一个分支,因此它非常有效。当所有检查结果都没有分支时,紧循环每秒可以执行数百万次。操作系统/嵌入式系统通常对 CPU 占用进行一些检测,以处理某些进程没有放弃对 CPU 的控制的情况 - 可以在紧密循环中执行此类事件的检查。最终,您需要了解程序在某些时候需要有循环,否则您无法对 CPU 做任何有用的事情,所以如果您从未看到需要循环,那是因为您的环境为您处理了所有这些。 CPU 会一直执行指令,直到没有任何东西可以执行或发生崩溃,因此像操作系统这样的程序必须有一个紧密循环才能实际运行,否则它只会运行几微秒。
【讨论】: