Izinkan saya memberi contoh:
$ 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
Di sini Anda dapat melihat bahwa perintah yes
menulis 11504640
baris dalam sedetik sementara saya hanya dapat menulis 1953
baris dalam 5 detik menggunakan bash's for
dan echo
.
Seperti yang disarankan dalam komentar, ada berbagai trik untuk membuatnya lebih efisien tetapi tidak ada yang mendekati kecepatan 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
Ini dapat menulis hingga 20 ribu baris dalam satu detik. Dan mereka dapat ditingkatkan lebih lanjut ke:
$ 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
Ini memberi kita hingga 40 ribu baris dalam satu detik. Lebih baik, tetapi masih jauh dari yes
yang bisa menulis sekitar 11 juta baris dalam satu detik!
Jadi, bagaimana yes
menulis ke file begitu cepat?
date
agak berat, ditambah shell harus membuka kembali aliran output untuk echo
untuk setiap iterasi loop. Dalam contoh pertama, hanya ada satu perintah perintah dengan redirection output tunggal, dan perintah ini sangat ringan. Keduanya sama sekali tidak sebanding.
date
mungkin berat, lihat edit pertanyaan saya.
timeout 1 $(while true; do echo "GNU">>file2; done;)
adalah cara yang salah untuk digunakan timeout
karena timeout
perintah hanya akan mulai setelah substitusi perintah selesai. Gunakan timeout 1 sh -c 'while true; do echo "GNU">>file2; done'
.
write(2)
panggilan sistem, bukan pada muatan kapal dari syscall lain, overhead shell, atau bahkan proses pembuatan dalam contoh pertama Anda (yang berjalan dan menunggu date
untuk setiap baris yang dicetak ke file). Satu detik penulisan hampir tidak cukup untuk bottleneck pada disk I / O (bukan CPU / memori), pada sistem modern dengan banyak RAM. Jika dibiarkan berjalan lebih lama, selisihnya akan lebih kecil. (Tergantung pada seberapa buruk implementasi bash yang Anda gunakan, dan kecepatan relatif CPU dan disk, Anda mungkin bahkan tidak memenuhi I / O disk dengan bash).