O exemplo abaixo me surpreendeu. Parece ser contra-intuitivo ... além do fato de que há muito mais tempo de uso para o echo | sed
combo.
Por que está echo
usando tanto tempo do sistema quando é executado sozinho, ou deveria ser a pergunta: como sed
muda o estado do jogo? Parece que echo
precisaria fazer o mesmo eco nos dois casos ...
time echo -n a\ {1..1000000}\ c$'\n' >file
# real 0m9.481s
# user 0m5.304s
# sys 0m4.172s
time echo -n a\ {1..1000000}\ c$'\n' |sed s/^\ // >file
# real 0m5.955s
# user 0m5.488s
# sys 0m1.580s
time echo ... |cat >file
e atétime echo ... |perl -ne 'print'
são tempos semelhantes àsed
versão.Respostas:
bahamat e Alan Curry estão certos: isso se deve à maneira como o shell armazena a saída
echo
. Especificamente, seu shell é bash e emite umawrite
chamada de sistema por linha. Portanto, o primeiro fragmento faz 1000000 gravações em um arquivo de disco, enquanto o segundo fragmento faz 1000000 gravações em um pipe e sed (principalmente em paralelo, se você tiver várias CPUs) faz um número consideravelmente menor de gravações em um arquivo de disco devido à sua saída carregando.Você pode observar o que está acontecendo executando strace .
Outros shells, como o ksh, protegem a saída
echo
mesmo quando ela é multilinha, para que você não veja muita diferença.Com o bash, recebo proporções de tempo semelhantes. Com o ksh, vejo o segundo trecho mais lento.
fonte
ksh
exemplo é mais ao longo das linhas do que eu esperava ...