Чи багатослівно виконуються команди роблять їх повільніше?


37

Я виявив, що -vпрапор використовую для багатьох додатків все менше і менше (особливо для дрібницьких матеріалів, таких як tarі cp). Однак, коли я це зробив, скажімо, розпаковуючи великий файл, це займе більше часу, ніж коли я не використовував -vпрапор.

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


Чи намагалися ви, наприклад, tar xvf file.tar > /dev/nullпроти tar xf file.tar? Перенаправлення на це /dev/nullповинно забрати свій термінал.
Бенджамін Баньє

3
Крім того, зауважте, що stdoutі stderrвони буферні, що означає, що заповнення буферів не займе так довго - це блокування printfвикликів (і виходу терміналу розширення), що триває назавжди.
new123456

1
Якби ви говорили про команди Windows, я б точно сказав, що це правда :)
kokbira

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

Відповіді:


31

Так, запускання верболозу уповільнить ваші програми.

Скільки залежить від програми.

Кожна друк на термінал потребує додаткового часу на обробку. У разі використання printf () або будь-якої з його сестер, це досить велика кількість обробки.

Також термінал повинен мати справу з цими даними. Між додатком і терміналом існує обмежений простір буфера, і канал вводу-виводу блокується, поки в зазначеному буфері не буде достатньо місця для фактичного виведення даних. Програма, як правило, не зможе продовжуватися, поки відбувається це блокування. 1

Крім того, акт відображення налагоджувального тексту на терміналі вимагає великих циклів обробки. Знову ж таки, це залежить як від програми (кількості налагодження), термінальної програми (використовувані шрифти, ефекти тощо), так і від використовуваного драйвера X windows (апаратне прискорення тощо).

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


1 У випадку багатопотокової програми фактично блокується лише нитка, що виконує налагодження.


Більшість програмістів дізнаються це досить швидко (Borland C в DOS);)
Драгос

Звичайно, якщо вікно консолі приховано (або навіть частково прикрито), воно не вплине майже так само, як коли видно консоль. Відкрийте командний рядок і виконайте команду a dir c:\/s/a. Ви можете бачити зміну швидкості, коли вона повністю видно і частково покрита. Ви не можете побачити його прискорення при мінімізації, але це, безумовно, швидше, хоча вам доведеться перезавантажити, якщо хочете протестувати, щоб обійти кешування, яке в будь-якому разі призведе до його швидшого, оскільки його не було б для доступу до диска.
Synetech

1
@Syn Ми тут говоримо про Linux.
Majenko

1
@Matt це все-таки дійсний коментар. Будьте з повагою.
nhinkle

@Matt, так! Я не помітив. (Можливо, я відволіклась від коментаря DOS.) Як би там не було, Linux є зовсім іншим, але мені цікаво, чи це те саме стосується (видимі консолі з великою кількістю прокрутки тексту працюють повільніше).
Synetech

8

Це залежить від програми, яку ви працюєте. Однак, загалом, можна сказати, що багатослівний сповільнення сповільнить більшість поширених додатків Linux, оскільки вони повинні синхронізувати свої дії між stdout та межами вводу / виводу або процесорами.


6

Використовуючи yesяк тестовий випадок на OS X 10.7, здається, це справді має значення, якщо ви надрукуєте багато терміналу на термінал, як можна було б очікувати.

Підрахувавши це трохи далі, я пробіг yesпротягом 5 секунд, в одному випадку надрукувавши висновок в термінал і зберігаючи його у файл (з tee), в іншому випадку роблячи те саме, за винятком перенаправлення stdoutна /dev/null:

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm

Випадок 1. дає 2371584 рядки, а випадок 2. дає 136421376 рядків, або в 57 разів більше. Таким чином, «ефективність» yes(вимірюється кількістю рядків, які вона друкує за одиницю часу), в цьому випадку, таким чином, у 57 разів повільніше .

Одне зауваження тут полягає в тому, що я використовував yesспільно з teeцим, що може трохи вплинути на результати, проте я думаю, що результати все-таки справедливі.

Ще одна вказівка ​​на те, що програма сповільнюється, полягає в тому, що yesпри запуску під час виходу в термінал термінал використовує близько 100% процесора і yesлише близько 37%, а при запуску yesбез виходу на термінал він використовує повністю 100% (це на мульти- основна машина, тому yesможна було б використовувати більше процесора, якщо це вдалося, за винятком випадків, коли його сповільнив термінал).


5

Легко просто відповісти "так", це сповільнить додаток. Але набагато правдивіша відповідь - це не має значення в 99% випадків.

Якщо ваш додаток робить будь-яку роботу , яка фактично бере деяку потужність процесора, шанси на друку кілька додаткових рядків тексту на екрані робить будь-який вид різниці близькі до 0%.

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


3
-1 це просто неправда. printf()це шалено дорого
Томас Боніні

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

@slarpspark: це не обов'язково мізерно, навіть якщо ми виведемо printf () з рівняння, потік байтів все одно повинен пройти через bash, потім термінальний емулятор, потім термінальний емулятор повинен був вивести текст на екран після розбору символів евакуації та подання тексту недешево, якщо це зроблено зі швидкістю, яку можуть зробити деякі багатослівні команди; і це було б особливо дорого, якщо програма промиває вихідний буфер у кожному рядку, оскільки це означає, що контекстні комутатори. Я часто відчуваю, коли пишуть сценарії python, що видалення відбитків у щільному циклі іноді може призвести від 10 до 1 секунди.
Лі Лі Раян

Що з командою, що працює над SSH, тоді навіть якщо час процесора мінімальний, коли ви впровадите затримку в мережі, безумовно, це важливо?
ec2011

3

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

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

Це питання може отримати багато користі від внеску досвідчених програмістів stackoverflow. Я пропоную переїхати :)

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