Bash

為什麼 echo >file 比 echo 使用更實時?sed >文件?

  • August 20, 2012

下面的例子讓我感到驚訝。這似乎是違反直覺的……除了這個組合的使用者時間更長的事實。echo | sed

為什麼單獨執行時echo使用這麼多sys 時間,或者問題應該是,如何sed改變遊戲狀態?似乎在這兩種情況下echo都需要做同樣的迴聲……

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

bahamat 和 Alan Curry 說得對:這是由於你的 shell 緩衝echo. 具體來說,您的 shell 是 bash,它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) ---

其他shell(例如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

使用 bash 我得到類似的時間比率。使用 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

引用自:https://unix.stackexchange.com/questions/45948