배쉬에서, touch
외부 바이너리이지만, echo
A는 쉘 내장 :
$ type echo
echo is a shell builtin
$ type touch
touch is /usr/bin/touch
touch
외부 바이너리 이므로 touch
파일 당 한 번만 호출 하므로 셸은의 30 만 개의 인스턴스를 생성해야 touch
하는데 시간이 오래 걸립니다.
echo
그러나 셸 내장이며 셸 내장을 실행하는 데 전혀 포크가 필요하지 않습니다. 대신, 현재 쉘은 모든 조작을 수행하며 외부 프로세스는 작성되지 않습니다. 이것이 너무 빠른 이유입니다.
다음은 셸 작업의 두 가지 프로필입니다. 를 사용할 때 새 프로세스를 복제하는 데 많은 시간이 소요된다는 것을 알 수 있습니다 touch
. /bin/echo
쉘 내장 대신에 사용하면 훨씬 더 비슷한 결과가 나타납니다.
터치 사용
$ strace -c -- bash -c 'for file in a{1..10000}; do touch "$file"; done'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
56.20 0.030925 2 20000 10000 wait4
38.12 0.020972 2 10000 clone
4.67 0.002569 0 80006 rt_sigprocmask
0.71 0.000388 0 20008 rt_sigaction
0.27 0.000150 0 10000 rt_sigreturn
[...]
에코 사용
$ strace -c -- bash -c 'for file in b{1..10000}; do echo >> "$file"; done'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
34.32 0.000685 0 50000 fcntl
22.14 0.000442 0 10000 write
19.59 0.000391 0 10011 open
14.58 0.000291 0 20000 dup2
8.37 0.000167 0 20013 close
[...]
echo >> $file
경우 개행을 추가$file
하여 수정합니다. OS / X에서도 동일하다고 가정합니다. 원하지 않으면을 사용하십시오echo -n >> $file
.