Что такое "тугая петля"? - PullRequest
62 голосов
/ 06 февраля 2010

Я много слышал эту фразу. Что это значит?

Пример поможет.

Ответы [ 7 ]

44 голосов
/ 06 февраля 2010

С Викисловарь :

  1. (вычисления) В языках ассемблера это цикл, который содержит мало инструкций и многократно повторяется.
  2. (вычисления) Такой цикл, который интенсивно использует ресурсы ввода-вывода или обработки, но не может должным образом обмениваться ими с другими программами, работающими в операционной системе.

Для случая 1 это, вероятно, похоже на

for (unsigned int i = 0; i < 0xffffffff; ++ i) {}
27 голосов
/ 06 февраля 2010

Я думаю, что эта фраза обычно используется для обозначения цикла, который повторяется много раз и который может серьезно повлиять на производительность программы, то есть он может использовать много циклов ЦП. Обычно вы слышите эту фразу в обсуждении оптимизации.

Например, я думаю об играх, где цикл должен обрабатывать каждый пиксель на экране, или научном приложении, где цикл обрабатывает записи в гигантских массивах точек данных.

8 голосов
/ 06 февраля 2010

В видео есть хороший пример узкой петли (~ бесконечной петли) Джон Скит и Тони Пони .

Пример:

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

, который создает замкнутый цикл, потому что IndexOf игнорирует символ нулевой ширины Юникода (таким образом находит два соседних пробела), но Replace не игнорирует их (таким образом, не заменяя любые соседние пробелы).

В других ответах уже есть хорошие определения, поэтому я больше не упоминаю их.

5 голосов
/ 14 ноября 2014

Тесная петля - это та, которая поддерживает кеш процессора. Это цикл, который помещается в кэш команд, который не имеет разветвлений и эффективно скрывает задержку выборки памяти для обрабатываемых данных.

3 голосов
/ 05 декабря 2014

Ответ SandeepJ является правильным в контексте сетевых устройств (например, см. Запись в Википедии в промежуточном окне), которые имеют дело с пакетами. Я хотел бы добавить, что поток / задача, выполняющая узкий цикл, пытается оставаться запланированным на одном процессоре, а не переключать контекст.

2 голосов
/ 06 февраля 2010

Согласно словарю Вебстера: «Цикл кода, который выполняется без выделения ресурсов другим программам или операционной системе».

http://www.websters -online-dictionary.org / ти / тайтовый + loop.html

1 голос
/ 21 декабря 2015

Из опыта я заметил, что если вы когда-нибудь пытаетесь сделать цикл, который работает бесконечно, например что-то вроде:

while(true)
{
    //do some processing
}

Такой цикл, скорее всего, всегда будет ресурсоемким. Если вы проверите использование ЦП и памяти процессом с помощью этого цикла, вы обнаружите, что он увеличился. Такова идея, которую некоторые люди называют «тесной петлей».

...