echo > fileがsed > fileを使用するよりもリアルタイムなのはなぜですか?

echo > fileがsed > fileを使用するよりもリアルタイムなのはなぜですか?

次の例は私を驚かせました。これは直観に反しているようです...実際にひげに多くがあることを除いてユーザー時間組合せのためecho | sed

なぜechoそんなに使うのか?システム時間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

ベストアンサー1

bahamatとAlan Curryが正しい。これはシェルバッファリングによるものですecho。特に、シェルはwrite1行に1つのシステムコールを発行するbashです。したがって、最初のフラグメントはディスクファイルに1000000書き込みを実行し、2番目のフラグメントはパイプに1000000書き込みを実行し、sed(複数のCPUがある場合はほとんど並列)は出力のためにディスクファイルに1000000書き込みを実行します。はるかに少ないバッファリングされます。

以下を実行すると、何が起こるのかを観察できます。ストレス

$ 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

bashを使用すると、同様の時間比率が得られます。 kshを使用すると、2番目のスニペットがより遅く実行されていることがわかります。

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

おすすめ記事