Я собираюсь догадаться, что вы используете Linux.
Если ваша
ls
команда имеет псевдоним, такой, что она показывает файлы и папки в цвете, то ей необходимо выяснить права доступа каждого элемента (вызов stat ()) и определить, установлены ли у них какие-либо «возможности файла» (вызов getxattr ()). выбрать правильный цвет. В зависимости от файловой системы эти вызовы могут быть довольно медленными, если необходимые метаданные еще не были кэшированы в ОЗУ. [Расширенные атрибуты часто находятся в области данных, поэтому каждый getxattr приводит к поиску жесткого диска.]С другой стороны,
ls |
при перенаправлении в канал автоматически отключается окрашивание, поэтому ему больше не нужно выполнять никаких дополнительных проверок - просто простой цикл readdir (), который возвращает имя и тип файла, и ядро, вероятно, даже реализует упреждающее чтение для тот.Обычно
ls
колонки выводят, что означает, что он должен прочитать весь каталог, прежде чем он сможет что-либо выводить вообще. При запуске через канал он автоматически отключает режим столбцов, и эта буферизация больше не требуется. (Общее время выполнения не обязательно быстрее, но вывод начинается раньше, что делает его более отзывчивым.)
Используйте strace
или, perf trace
чтобы проверить, какие системные вызовы, если они есть, занимают много времени.