El ejemplo a continuación me sorprendió. Parece ser contrario a la intuición ... aparte del hecho de que hay un bigote más tiempo de usuario para el echo | sed
combo.
¿Por qué está echo
usando tanto tiempo del sistema cuando se ejecuta solo, o debería ser la pregunta, ¿Cómo sed
cambia el estado de juego? Parece que echo
tendría que hacer el mismo eco en ambos 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 inclusotime echo ... |perl -ne 'print'
son tiempos similares a lased
versión.Respuestas:
bahamat y Alan Curry tienen razón: esto se debe a la forma en que su shell amortigua la salida de
echo
. Específicamente, su shell es bash y emite unawrite
llamada al sistema por línea. Por lo tanto, el primer fragmento realiza 1000000 escrituras en un archivo de disco, mientras que el segundo fragmento realiza 1000000 escrituras en una tubería y sed (en gran parte en paralelo, si tiene varias CPU) hace un número considerablemente menor de escrituras en un archivo de disco debido a su salida almacenamiento en búfer.Puedes observar lo que está sucediendo corriendo strace .
Otros shells como ksh amortiguan la salida
echo
incluso cuando es multilínea, por lo que no verá mucha diferencia.Con bash obtengo proporciones de tiempo similares. Con ksh veo que el segundo fragmento se ejecuta más lentamente.
fuente
ksh
ejemplo es más