【问题标题】:What is a "tight loop"?什么是“紧密循环”?
【发布时间】:2011-01-13 20:29:30
【问题描述】:

这句话我听过很多次。什么意思?

举个例子会有所帮助。

【问题讨论】:

    标签: terminology


    【解决方案1】:

    来自Wiktionary

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

    对于案例 1,它可能是这样的

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

    【讨论】:

    • 1) 这个例子不是一个紧密的循环,它是一个 NOP :) 2) 我从来没有在我的生活中看到过这个含义。听起来更像是“资源猪”
    • 具有一些智能(ish)优化的智能(ish)编译器将摆脱它。
    • 继续上面的cmets,while (condition == false) {}不是更好的例子吗?
    • 我认为这个循环,甚至是@jdrd 发布的那个循环只会使用一个 CPU 内核的所有性能。人们为什么使用它?
    【解决方案2】:

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

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

    【讨论】:

    • 经常执行的部分代码可能是一个很好的优化候选者,但它通常不是一个紧密的循环。即使它经常被调用——如果调用是通过多层函数和对象发生的,它也不是“紧密的”。循环条件和循环指令需要彼此非常紧密,代码在同一个文件和相同的几行代码中以实现“紧密循环”。
    • 我听说过答案中描述的那种循环,称为程序中的“热点”——一个有针对性的优化会得到回报的地方。正是出于这个原因,Sun 将他们的自适应配置文件驱动的即时编译技术命名为“HotSpot”。
    • @foo:它们根本不必在同一个文件中。现代编译器可以将抽象层完全消除...(例如:C++ 模板)
    【解决方案3】:

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

    例子是:

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

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

    其他答案中已经有很好的定义了,不再赘述。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 我见过,但你能举个例子吗?
          • 实际上,我非常不同意这个定义。由于大多数循环不会释放此类资源,这意味着大多数循环都是紧密循环。
          【解决方案7】:

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

          while(true)
          {
              //do some processing
          }
          

          这样的循环很可能总是占用大量资源。如果您使用此循环检查进程的 CPU 和内存使用情况,您会发现它会猛增。这就是一些人所说的“紧密循环”的想法。

          【讨论】:

            【解决方案8】:

            现在的许多编程环境不会让程序员接触到需要紧密循环的条件,例如Java Web 服务在调用您的代码的容器中运行,您需要最小化/消除 servlet 实现中的循环。像 Node.js 这样的系统处理紧密循环,您应该再次在自己的代码中最小化/消除循环。它们用于您可以完全控制程序执行的情况,例如操作系统或实时/嵌入式环境。在操作系统的情况下,您可以将 CPU 处于空闲状态视为它在紧密循环中花费的时间量,因为紧密循环是它执行检查以查看其他进程是否需要运行或是否存在是需要服务的队列,所以如果没有需要运行的进程并且队列是空的,那么 CPU 只是在紧密循环中旋转,这会产生 CPU 有多“不忙”的概念指示。紧密循环应设计为仅执行检查,因此它就像一个 if .. then 语句的大列表,因此在汇编中它将归结为一个比较操作数,然后是一个分支,因此它非常有效。当所有检查结果都没有分支时,紧循环每秒可以执行数百万次。操作系统/嵌入式系统通常对 CPU 占用进行一些检测,以处理某些进程没有放弃对 CPU 的控制的情况 - 可以在紧密循环中执行此类事件的检查。最终,您需要了解程序在某些时候需要有循环,否则您无法对 CPU 做任何有用的事情,所以如果您从未看到需要循环,那是因为您的环境为您处理了所有这些。 CPU 会一直执行指令,直到没有任何东西可以执行或发生崩溃,因此像操作系统这样的程序必须有一个紧密循环才能实际运行,否则它只会运行几微秒。

            【讨论】:

              猜你喜欢
              • 2013-06-14
              • 1970-01-01
              • 2010-11-03
              • 2011-04-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多