35

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

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

5 ответов5

29

Да, запуск многословных замедлит работу ваших приложений.

Сколько зависит от приложения.

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

Кроме того, терминал должен иметь дело с этими данными. Между приложением и терминалом существует ограниченный объем буферного пространства, и канал ввода-вывода будет блокироваться до тех пор, пока в указанном буфере не будет достаточно места для фактического вывода данных. Приложение, как правило, не сможет продолжить работу, пока происходит эта блокировка. 1

Кроме того, процесс отображения текста отладки на терминале будет занимать циклы обработки. Опять же, это зависит как от приложения (количество отладки), программы терминала (используемые шрифты, эффекты и т.д.), Так и даже от используемого драйвера X Windows (аппаратное ускорение и т.д.).

time программа может использоваться для довольно точного определения того, сколько времени потребовалось команде для выполнения. Запуск одной и той же программы дважды во времени, один раз с отладкой, а второй без, покажет вам, насколько это важно. Я бы предложил выполнить команду один раз перед выполнением тестов, чтобы убедиться, что кэширование одинаково для обоих тестовых прогонов команды. Вы не хотите искажать результаты, поскольку второй запуск выполняется намного быстрее, потому что большая часть данных была кэширована при первом запуске, теперь вы ...


1 В случае многопоточного приложения на самом деле блокируется только поток, выполняющий выходные данные отладки.

8

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

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

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

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

Этот вопрос может быть очень полезен благодаря вкладу опытных программистов stackoverflow. Предлагаю переехать :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .