L'exemple ci-dessous m'a surpris. Cela semble être contre-intuitif ... à part le fait qu'il y a un temps d'utilisation plus important pour le echo | sed
combo.
Pourquoi echo
utilise-t-on autant de temps système lorsqu'il fonctionne seul, ou la question devrait-elle être: comment sed
change-t-on l'état des lieux? Il semble qu'il echo
faudrait faire le même écho dans les deux cas ...
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
ettime echo ... |perl -ne 'print'
sont même des temps similaires à lased
version.Réponses:
bahamat et Alan Curry ont raison: cela est dû à la façon dont votre shell met en mémoire tampon la sortie de
echo
. Plus précisément, votre shell est bash et émet unwrite
appel système par ligne. Par conséquent, le premier extrait fait 1000000 écritures sur un fichier disque, tandis que le deuxième extrait fait 1000000 écritures sur un canal et sed (en grande partie en parallèle, si vous avez plusieurs processeurs) fait un nombre considérablement plus faible d'écritures sur un fichier disque en raison de sa sortie mise en mémoire tampon.Vous pouvez observer ce qui se passe en exécutant strace .
D'autres shells tels que ksh tamponnent la sortie de
echo
même quand il est multiligne, donc vous ne verrez pas beaucoup de différence.Avec bash, j'obtiens des rapports de synchronisation similaires. Avec ksh, je vois le deuxième extrait fonctionner plus lentement.
la source
ksh
exemple correspond plus à ce que j'attendais ...