Що таке “щільна петля”?


77

Я багато чув цю фразу. Що це означає?

Приклад може допомогти.


Контекст, у якому ви читаєте це, допоможе нам зрозуміти ваше запитання. Не могли б ви надати цитату, посилання чи якусь підказку?
S.Lott

1
Я щойно чув, як про нього перев'язували в офісі. Я не зовсім зареєстрував контекст. Я здогадуюсь, що мене трохи роздратувало те, що багато бандитизму про те, що відбувається.
Frederick The Fool,

1
Можливо, люди в офісі просто викидають випадкові модні слова. Чи ні. Ви можете запитати їх, що вони означають.
S.Lott

Відповіді:


52

З Вікісловника :

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

Для випадку 1 це, мабуть, подібне

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

5
1) Приклад - це не туга петля, це NOP :) 2) Я ніколи в житті не бачив цього сенсу. Це звучить більше як "свиня"
Каролі Горват

2
розумний (ish) компілятор з деякими розумними (ish) оптимізаціями позбавить його.
djh

1
Якщо продовжувати наведені вище коментарі, чи не while (condition == false) {}кращий приклад?
jdrd

Я думаю, що цей цикл, і навіть той, який @jdrd розмістив, буде просто використовувати всю продуктивність одного ядра процесора. Чому люди цим користуються?
Minh Nghĩa

31

Я думаю, що фраза зазвичай використовується для позначення циклу, який повторюється багато разів і який може мати серйозний вплив на продуктивність програми - тобто вона може використовувати багато циклів процесора. Зазвичай ви можете почути цю фразу під час обговорення питань оптимізації.

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


4
Частина коду, яка часто виконується, може бути хорошим кандидатом для оптимізації, але загалом це не є вузьким циклом. Навіть якщо його часто викликають - якщо виклик відбувається через декілька шарів функцій та об'єктів, це не "тісно". Умова циклу та інструкції циклу повинні бути дуже щільними один до одного, кодуватися в одному файлі та однакових кількох рядках для "тугого циклу".
foo

Я чув, що такий цикл, описаний у відповіді, називається "гарячою точкою" у програмі - місці, де цілеспрямована оптимізація дасть свої результати. Саме з цієї причини Sun назвала їхню адаптивну технологію компіляції, яка керується профілями, "HotSpot".
Jeffrey Hantin

1
@foo: Вони взагалі не повинні бути в одному файлі. Сучасні компілятори можуть щасливо усунути шари абстракцій у ніщо ... (наприклад: шаблони C ++)
Каролі Горват

13

У відео є хороший приклад щільного циклу (~ нескінченний цикл) Джон Скіт і Тоні Поні .

Приклад:

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

який створює щільний цикл, оскільки IndexOf ігнорує символ нульової ширини Unicode (таким чином знаходить два сусідні пробіли), але Replaceне ігнорує їх (таким чином, не замінюючи сусідні пробіли).

В інших відповідях вже є хороші визначення, тому я їх більше не згадую.


10

Щільний цикл - це той, який зручний для кешування процесора. Це цикл, який поміщається в кеш інструкцій, який не розгалужується, і який ефективно приховує затримку отримання пам’яті для оброблюваних даних.


5

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


4

Згідно зі словником Вебстера, "цикл коду, який виконується без випуску ресурсів для інших програм або операційної системи".

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


Я це бачив, але чи можете ви проілюструвати це на прикладі?
Frederick The Fool,

3
Насправді, я категорично не погоджуюся з цим визначенням. оскільки більшість циклів не випускають таких ресурсів, це означає, що більшість циклів є жорсткими циклами.

2

З досвіду я помітив, що якщо ви коли-небудь намагаєтесь виконати цикл, який працює необмежено довго, наприклад, щось на зразок:

while(true)
{
    //do some processing
}

Такий цикл, швидше за все, завжди буде ресурсомістким. Якщо ви перевірите використання процесора та пам’яті процесом за допомогою цього циклу, то виявите, що він зник. Таку ідею деякі люди називають "щільною петлею".


0

Багато середовищ програмування сьогодні не піддають програміста умовам, які потребують жорсткого циклу, наприклад, веб-служби Java працюють у контейнері, який викликає ваш код, і вам потрібно мінімізувати / усунути цикли в реалізації сервлета. Такі системи, як Node.js, обробляють жорсткий цикл, і знову вам слід мінімізувати / усунути цикли у власному коді. Вони використовуються в тих випадках, коли ви повністю контролюєте виконання програми, наприклад ОС або реальне час / вбудовані середовища. У випадку з ОС, ви можете уявити, що центральний процесор перебуває в режимі очікування, як кількість часу, який він проводить у тісному циклі, оскільки саме туди він виконує перевірки, чи потрібно запускати інші процеси, чи є - це черги, які потребують обслуговування, тому, якщо немає процесів, які потрібно запускати, а черги порожні, тоді центральний процесор просто звикає по цілому циклу, і це дає умовне вказівку на те, наскільки CPU “не зайнятий”. Тісний цикл повинен бути спроектований як просто виконання перевірок, тому він стає просто великим списком операторів if .. then, тому в Асамблеї він зводиться до операнда COMPARE, а потім гілки, тому він є дуже ефективним. Коли всі перевірки призводять до не розгалуження, щільний цикл може виконуватися мільйони разів на секунду. Операційні / вбудовані системи, як правило, мають певне виявлення для обробки процесора, щоб обробляти випадки, коли якийсь процес не відмовився від управління процесором - перевірки такого типу випадків можуть виконуватися в умовах жорсткого циклу. Зрештою, ви повинні розуміти, що програма в певний момент повинна мати цикл, інакше ви не зможете зробити нічого корисного з центральним процесором, тому, якщо ви ніколи не бачите потреби в циклі, це тому, що ваше середовище все це обробляє за вас. Процесор продовжує виконувати інструкції, поки не залишиться нічого виконати або ви не отримаєте збій, тому програма, така як ОС, повинна мати щільний цикл, щоб фактично функціонувати, інакше вона працювала б лише мікросекунди. Зрештою, ви повинні розуміти, що програма в певний момент повинна мати цикл, інакше ви не зможете зробити нічого корисного з центральним процесором, тому, якщо ви ніколи не бачите потреби в циклі, це тому, що ваше середовище все це обробляє за вас. Процесор продовжує виконувати інструкції, поки не залишиться нічого виконати або ви не отримаєте збій, тому програма, така як ОС, повинна мати щільний цикл, щоб насправді функціонувати, інакше вона працювала б лише мікросекунди. Зрештою, ви повинні розуміти, що програма в певний момент повинна мати цикл, інакше ви не зможете зробити нічого корисного з центральним процесором, тому, якщо ви ніколи не бачите потреби в циклі, це тому, що ваше середовище все це обробляє за вас. Процесор продовжує виконувати інструкції, поки не залишиться нічого виконати або ви не отримаєте збій, тому програма, така як ОС, повинна мати щільний цикл, щоб фактично функціонувати, інакше вона працювала б лише мікросекунди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.