bahamat และอลันแกงมีมันขวา: echo
นี้เป็นเพราะวิธีการที่เปลือกของคุณบัฟเฟอร์การส่งออกของ เชลล์ของคุณมีการทุบตีโดยเฉพาะและจะwrite
เรียกการเรียกใช้ระบบหนึ่งรายการต่อบรรทัด ดังนั้นตัวอย่างแรกทำให้ 1000000 เขียนไปยังไฟล์ดิสก์ในขณะที่ตัวอย่างที่สองทำให้ 1000000 เขียนไปยังไปป์และ sed (ส่วนใหญ่ในแบบคู่ขนานถ้าคุณมี CPU หลายตัว) ทำให้เขียนจำนวนน้อยลงไปยังดิสก์ไฟล์เนื่องจากผลลัพธ์ บัฟเฟอร์
คุณสามารถสังเกตเห็นสิ่งที่เกิดขึ้นโดยการเรียกใช้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) ---
เชลล์อื่น ๆ เช่น ksh บัฟเฟอร์เอาต์พุตecho
แม้เมื่อเป็นหลายบรรทัดดังนั้นคุณจะไม่เห็นความแตกต่างมากนัก
$ 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
เมื่อทุบตีฉันจะได้อัตราส่วนเวลาใกล้เคียงกัน ด้วย ksh ฉันเห็นตัวอย่างที่สองทำงานช้าลง
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