Использование -v (многословно) замедляет команды?

34

В этом вопросе: Как удалить все файлы и подкаталоги в каталоге БЕЗ удаления каталога в bash? спрашивается, как удалить весь файл в папке, а не саму папку.

Отличный ответ Мэтта включает использование флага -v для команды 'rm'.

rm -rfv dontDeleteMe && mkdir dontDeleteMe

Команда, которую я оставил, была выше. Конечно, действительно полезно, но разве флаг -v в 'rm' и / или вообще замедляет задачи, выполняемые через командную строку?

У меня есть папка с .txt-файлами (их около 100 000), которые я несколько раз создавал, удалял и воссоздавал для себя. Иногда с rm, иногда в браузере файлов, и я чувствую, что использовать команду rm еще медленнее, как показано выше. Флаг -v имеет какое-либо отношение к этому?

Eiriks
источник

Ответы:

37

Да, флаг -v замедляет команду.

Большинство, если не все программное обеспечение (или команды) проверит наличие флага, а затем выполнит связку кода, связанную с этим флагом. В случае флага -v они, скорее всего, будут выполнять несколько команд вывода (например, echoили printf), которые они, скорее всего, пропустили бы без флага.

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

Лучше, если вы не используете флаг -v, если вы не собираетесь читать / нуждаться в сообщениях.

С другой стороны, CLI будет / должен быть быстрее, чем GUI, при условии, что вы не включите время, необходимое для ввода команд и нажатия Enterклавиши.

Из этого блога суперпользователя это изображение очень хорошо объясняет медлительность

введите описание изображения здесь

Для конкретной рассматриваемой команды результаты команды времени

//with -v
real    0m8.753s
user    0m0.816s
sys     0m2.036s

//without -v
real    0m1.282s
user    0m0.124s
sys     0m1.092s

это было сделано с каталогом, содержащим 100000 пустых файлов

зарегистрированный пользователь
источник
9
Я бы не говорил о «эхо-командах». Большинство программ не являются скриптами bash, поэтому они не вызывают эхо. Проблема в том, что они пишут в stdout (или stderr ), другими словами, они выполняют операции ввода-вывода, которые требуют времени (ввод-вывод является дорогостоящим), а также они требуют системных вызовов (что означает больше переключений контекста и, следовательно, больше не хватает кеша и т.д.).
Бакуриу
23
Основная проблема с записью в стандартный вывод - это фактическое отображение этого содержимого; если вы перенаправляете стандартный вывод в файл, или /dev/nullпроизводительность не так сильно снижается, как отображение текста на эмуляторе терминала.
Джейкоб Кралл
Как видно из графика, разница во времени незначительна, если вы говорите о времени отклика с человеческой точки зрения. Таким образом, если вы беспокоитесь об эффективности для человека, наблюдающего за командой, это не имеет значения. Это актуально только для огромного количества файлов или для многократных повторов, когда драгоценное время компьютера (например, загруженный веб-сервер или старый компьютер).
Пэдди Ландау
Наибольшее влияние, и, вероятно, единственный случай, когда это действительно имеет значение, - это запуск команды на удаленном компьютере через SSH. Подробное ведение журнала может легко генерировать десятки мегабайт трафика, который должен был бы передаваться с хоста на вашу консоль. Однажды я испытал ускорение порядка 10x после удаления излишнего журналирования консоли из сценария, который я запускал через SSH.
Сергей
5

Почему бы не узнать себя: использовать время.

$ time rm -rfv dontDeleteMe && mkdir dontDeleteMe
real    0m0.003s
user    0m0.001s
sys     0m0.002s

$ time rm -rf dontDeleteMe && mkdir dontDeleteMe
real    0m0.002s
user    0m0.001s
sys     0m0.001s
sethmuss
источник
10
Это на самом деле не отвечает на вопрос. Разница в 1 мс между отдельными запусками каждой команды может быть вызвана множеством факторов. Также не ясно, если вы пропустили -vвывод или каталог был пуст.
Не говоря уже о замедлении не из-за дополнительных выполненных инструкций, а из процесса записи его в файл или терминал. time' pretty much redirects the output to / DEV / нуль.
Коул Джонсон