1

У меня есть около 17k файлов в каталоге. Когда я запускаю ls directory , мне приходится ждать 15-20 секунд, прежде чем отобразятся результаты. С другой стороны, когда я запускаю ls directory | wc -l каталог wc -l или ls directory | grep .xyz , результаты отображаются сразу.

Почему это происходит и есть ли способ это исправить?

2 ответа2

2

Я собираюсь догадаться, что вы используете Linux.

  1. Если ваша команда ls имеет псевдоним так, что она показывает файлы и папки в цвете, то ей необходимо выяснить права доступа каждого элемента (вызов stat ()) и определить, установлены ли в нем какие-либо "файловые возможности" (вызов getxattr ()) в Для того, чтобы выбрать правильный цвет. В зависимости от файловой системы эти вызовы могут быть довольно медленными, если необходимые метаданные еще не были кэшированы в оперативной памяти. [Расширенные атрибуты часто находятся в области данных, поэтому каждый getxattr приводит к поиску жесткого диска.]

    С другой стороны, ls | при перенаправлении в канал автоматически отключается окрашивание, поэтому ему больше не нужно выполнять никаких дополнительных проверок - просто простой цикл readdir (), который возвращает имя и тип файла, и ядро, вероятно, даже реализует упреждающее чтение для этого.

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

Используйте strace или perf trace чтобы проверить, какие системные вызовы, если они есть, занимают много времени.

0

Две вещи:

  1. Если вы сначала запустите ls и ls | wc -l позже, возможно, первый из них будет читать с вашего жесткого диска, а второй будет считывать кэшированные данные. Если это так, ls изначально "останавливается" и ничего не печатает в течение нескольких секунд. Другой ls начнет печатать практически сразу, пока кэшированные данные все еще там. Если вы начали с ls | wc -l в первую очередь, придется ждать HDD поставлять данные.
  2. Любой терминал работает со своей скоростью. Формально stty speed покажет вам некоторую ценность, но я думаю, что это не имеет значения для виртуального терминала. Тем не менее, отображение символов и прокрутка занимает много времени (см. Этот вопрос). Передача тех же данных через канал происходит быстрее.

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