Vou adivinhar que você está usando o Linux.
-
Se o seu comando
ls
tiver um alias de tal forma que mostre os arquivos & pastas em cores, então ele precisa descobrir as permissões de cada item (uma chamada stat ()) e se possui algum conjunto de "recursos de arquivo" (uma chamada getxattr ()) para escolher a cor certa. Dependendo do sistema de arquivos, essas chamadas podem ser bastante lentas se os metadados necessários ainda não tiverem sido armazenados em cache na RAM. [Atributos estendidos geralmente moram na área de dados, então cada resultado getxattr no HDD procura.]Por outro lado,
ls |
quando redirecionado para um pipe automaticamente desativa a coloração, portanto não precisa mais fazer verificações extras - apenas um loop readdir () simples que retorna o nome e tipo do arquivo, e o kernel provavelmente até mesmo implementa a leitura antecipada para isso. -
Normalmente,
ls
colunde sua saída, o que significa que precisa ler o diretório inteiro antes de poder produzir qualquer coisa. Quando executado através de um pipe, ele desativa automaticamente o modo de colunas e esse buffer não é mais necessário. (O tempo total de execução não é necessariamente mais rápido, mas a saída começa antes, fazendo com que ele se sinta mais responsivo.)
Use strace
ou perf trace
para verificar quais chamadas do sistema, se houver, estão demorando muito.