Das folgende Beispiel hat mich überrascht. Es scheint kontraintuitiv zu sein ... abgesehen von der Tatsache, dass ein Whisker mehr Benutzerzeit für die echo | sed
Combo hat.
Warum verbraucht sysecho
so viel Zeit, wenn es alleine läuft, oder sollte sich die Frage stellen, wie sich sed
der Stand der Dinge ändert ? Es scheint, dass in beiden Fällen echo
das gleiche Echo erfolgen müsste ...
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
und sind sogartime echo ... |perl -ne 'print'
mal dersed
version ähnlich .Antworten:
Bahamat und Alan Curry haben Recht: Dies liegt an der Art und Weise, wie Ihre Shell die Ausgabe von puffert
echo
. Insbesondere handelt es sich bei Ihrer Shell um eine Bash-Shell, die einenwrite
Systemaufruf pro Zeile ausgibt . Daher schreibt das erste Snippet 1000000 in eine Festplattendatei, während das zweite Snippet 1000000 in eine Pipe schreibt und sed (bei mehreren CPUs weitgehend parallel) aufgrund seiner Ausgabe eine erheblich geringere Anzahl von Schreibvorgängen in eine Festplattendatei durchführt Pufferung.Sie können beobachten , was durch Laufen ist los Strace .
Andere Shells wie ksh puffern die Ausgabe
echo
auch dann, wenn sie mehrzeilig ist, sodass Sie keinen großen Unterschied feststellen können.Mit Bash bekomme ich ähnliche Timing-Verhältnisse. Mit ksh sehe ich das zweite Snippet langsamer laufen.
quelle
ksh
Beispiel entspricht eher