예를 들어 보겠습니다.
$ timeout 1 yes "GNU" > file1
$ wc -l file1
11504640 file1
$ for ((sec0=`date +%S`;sec<=$(($sec0+5));sec=`date +%S`)); do echo "GNU" >> file2; done
$ wc -l file2
1953 file2
여기서 당신은 명령을 볼 수 있습니다 yes
쓴다 11504640
내가에만 쓸 수 있지만 두 번째에 라인을 1953
배쉬의 사용 오초에 라인 for
과 echo
.
의견에서 제안했듯이, 더 효율적으로 만드는 여러 가지 트릭이 있지만 다음과 같은 속도에 근접하지는 않습니다 yes
.
$ ( while :; do echo "GNU" >> file3; done) & pid=$! ; sleep 1 ; kill $pid
[1] 3054
$ wc -l file3
19596 file3
$ timeout 1 bash -c 'while true; do echo "GNU" >> file4; done'
$ wc -l file4
18912 file4
이것들은 1 초에 최대 2 만 라인을 쓸 수 있습니다. 그리고 다음과 같이 더 향상 될 수 있습니다.
$ timeout 1 bash -c 'while true; do echo "GNU"; done >> file5'
$ wc -l file5
34517 file5
$ ( while :; do echo "GNU"; done >> file6 ) & pid=$! ; sleep 1 ; kill $pid
[1] 5690
$ wc -l file6
40961 file6
이것들은 1 초에 최대 4 만 라인을 제공합니다. 더 낫지 만 여전히 yes
1,100 만 줄을 쓸 수있는 외침 이 있습니다!
그렇다면 파일에 이렇게 빨리 쓰는 방법은 yes
무엇입니까?
date
이 있으며 다소 무겁고, 쉘은 echo
모든 루프 반복 에 대해 출력 스트림을 다시 열어야합니다 . 첫 번째 예에서는 단일 출력 리디렉션으로 단일 명령 호출 만 있으며 명령은 매우 가볍습니다. 이 둘은 결코 비교할 수 없습니다.
date
무거울 수 있습니다. 내 질문에 대한 편집을 참조하십시오.
timeout 1 $(while true; do echo "GNU">>file2; done;)
명령 대체가 완료된 후에 만 명령이 시작 timeout
되므로 잘못된 사용법 timeout
입니다. 사용하십시오 timeout 1 sh -c 'while true; do echo "GNU">>file2; done'
.
write(2)
첫 번째 예제 ( date
파일에 인쇄 된 모든 줄 을 실행하고 대기하는)에서 다른 시스템 콜의 보트로드, 쉘 오버 헤드 또는 프로세스 생성에 CPU 시간을 소비하여 시스템 호출 에만 소비 합니다 . RAM이 많은 최신 시스템에서는 1 초의 쓰기로 CPU / 메모리가 아닌 디스크 I / O에서 병목 현상이 발생할 수 있습니다. 더 오래 달릴 수 있다면 차이는 더 작아 질 것입니다. (bash 구현의 나쁜 정도와 CPU 및 디스크의 상대 속도에 따라 bash로 디스크 I / O를 포화시키지 않을 수도 있습니다).