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 yesmenulis 11504640baris dalam sedetik sementara saya hanya dapat menulis 1953baris dalam 5 detik menggunakan bash's fordan 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 yesyang bisa menulis sekitar 11 juta baris dalam satu detik!
Jadi, bagaimana yesmenulis ke file begitu cepat?
dateagak berat, ditambah shell harus membuka kembali aliran output untuk echountuk 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.
datemungkin berat, lihat edit pertanyaan saya.
timeout 1 $(while true; do echo "GNU">>file2; done;)adalah cara yang salah untuk digunakan timeout karena timeoutperintah 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 dateuntuk 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).