Bir örnek vereyim:
$ 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
Burada komutun saniyede satır yes
yazdığını 11504640
, 1953
bash for
ve tuşlarını kullanarak 5 saniyede sadece satır yazabileceğimi görebilirsiniz echo
.
Yorumlarda önerildiği gibi, daha verimli hale getirmek için çeşitli hileler vardır, ancak hiçbiri hızını eşleştirmek için yaklaşmaz 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
Bunlar saniyede 20 bin satıra kadar yazabilir. Ve bunlar daha da geliştirilebilir:
$ 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
Bunlar bizi saniyede 40 bin hatta çıkarır. Daha iyi, ama yine yes
de bir saniyede 11 milyon satır yazabilen uzak bir çığlık !
Peki dosyaya bu kadar çabuk nasıl yes
yazılır?
date
biraz ağırdır, ayrıca kabuğun echo
her döngü yinelemesi için çıktı akışını yeniden açması gerekir . İlk örnekte, tek bir çıkış yönlendirmesi ile yalnızca bir tek komut çağırma var ve komut son derece hafif. İkisi hiçbir şekilde karşılaştırılamaz.
date
ağır olabilir, sorumu değiştirmeye bakın.
timeout 1 $(while true; do echo "GNU">>file2; done;)
kullanmak yanlış bir yoldur timeout
çünkü timeout
komut ikamesi bittiğinde komut sadece başlayacaktır. Kullanın timeout 1 sh -c 'while true; do echo "GNU">>file2; done'
.
write(2)
çağrısını sadece sistem çağrılarına harcayarak , diğer sistem çağrılarının yükünü doldurma, baş üstü kabuk ve hatta işlem oluşturma işleminin ilk örneğinde ( date
dosyaya basılan her satır için çalışır ve bekler ). Yazının bir saniyesi, disk G / Ç'de (CPU / bellek yerine), çok miktarda RAM içeren modern bir sistemde tıkanması için zar zor. Daha uzun süre çalışmasına izin verilirse, fark daha küçük olacaktır. (Bir bash uygulamasının ne kadar kötü kullandığınıza ve CPU ve diskin göreceli hızına bağlı olarak, disk G / Ç'sini bash ile doyuramayabilirsiniz).