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. 특히 쉘은 write한 줄에 하나의 시스템 호출을 발행하는 bash입니다. 따라서 첫 번째 조각은 디스크 파일에 1000000 쓰기를 수행하고 두 번째 조각은 파이프에 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를 사용하면 두 번째 스니펫이 더 느리게 실행되는 것을 볼 수 있습니다.

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

관련 정보