bahamat dan Alan Curry melakukannya dengan benar: ini karena cara shell Anda buffer output echo
. Secara khusus, shell Anda adalah bash, dan ia mengeluarkan satu write
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 .
$ strace -f -e write bash -c 'echo -n a\ {1..2}\ c$'\'\\n\'' >file'
write(1, "a 1 c\n", 6) = 6
write(1, " a 2 c\n", 7) = 7
$ strace -f -e write bash -c 'echo -n a\ {1..2}\ c$'\'\\n\'' | sed "s/^ //" >file'
Process 28052 attached
Process 28053 attached
Process 28051 suspended
[pid 28052] write(1, "a 1 c\n", 6) = 6
[pid 28052] write(1, " a 2 c\n", 7) = 7
Process 28051 resumed
Process 28052 detached
Process 28051 suspended
[pid 28053] write(1, "a 1 c\na 2 c\n", 12) = 12
Process 28051 resumed
Process 28053 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
Kerang lain seperti ksh buffer output echo
bahkan ketika itu multiline, sehingga Anda tidak akan melihat banyak perbedaan.
$ strace -f -e write ksh -c 'echo -n a\ {1..2}\ c$'\'\\n\'' >file'
write(1, "a 1 c\n a 2 c\n", 13) = 13
$ strace -f -e write ksh -c 'echo -n a\ {1..2}\ c$'\'\\n\'' | sed "s/^ //" >file'
Process 28058 attached
[pid 28058] write(1, "a 1 c\n a 2 c\n", 13) = 13
Process 28058 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "a 1 c\na 2 c\n", 12) = 12
Dengan bash saya mendapatkan rasio waktu yang sama. Dengan ksh saya melihat potongan kedua berjalan lebih lambat.
ksh$ time echo -n a\ {1..1000000}\ c$'\n' >file
real 0m1.44s
user 0m1.28s
sys 0m0.06s
ksh$ time echo -n a\ {1..1000000}\ c$'\n' | sed "s/^ //" >file
real 0m2.38s
user 0m1.52s
sys 0m0.14s