Contoh di bawah ini mengejutkan saya. Tampaknya kontra intuitif ... selain dari fakta bahwa ada kumis lebih banyak waktu pengguna untuk echo | sed
kombo.
Mengapa echo
menggunakan begitu banyak waktu sistem ketika berjalan sendiri, atau seharusnya pertanyaannya adalah, Bagaimana sed
mengubah keadaan permainan? Tampaknya echo
perlu melakukan gema yang sama dalam kedua kasus ...
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
dan bahkan waktutime echo ... |perl -ne 'print'
yang mirip dengansed
versi.Jawaban:
bahamat dan Alan Curry melakukannya dengan benar: ini karena cara shell Anda buffer output
echo
. Secara khusus, shell Anda adalah bash, dan ia mengeluarkan satuwrite
panggilan sistem per baris. Oleh karena itu potongan pertama membuat 10.00000 menulis ke file disk, sedangkan potongan kedua membuat 10.00000 menulis ke pipa dan sed (sebagian besar secara paralel, jika Anda memiliki beberapa CPU) membuat jumlah penulisan ke file disk jauh lebih kecil karena outputnya buffering.Anda dapat mengamati apa yang terjadi dengan menjalankan strace .
Kerang lain seperti ksh buffer output
echo
bahkan ketika itu multiline, sehingga Anda tidak akan melihat banyak perbedaan.Dengan bash saya mendapatkan rasio waktu yang sama. Dengan ksh saya melihat potongan kedua berjalan lebih lambat.
sumber
ksh
Contoh terakhir itu lebih sesuai dengan apa yang saya harapkan ...