Позвольте мне привести пример:
$ 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
строки за 5 секунд, используя bash 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
Они могут записывать до 20 тысяч строк в секунду. И они могут быть улучшены до:
$ 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
Это дает нам до 40 тысяч строк в секунду. Лучше, но все же далеко, из yes
которого можно написать около 11 миллионов строк в секунду!
Итак, как 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
каждой строки, напечатанной в файле). Одной секунды записи едва хватает для узкого места на дисковых операциях ввода-вывода (а не на процессоре / памяти) в современной системе с большим объемом оперативной памяти. Если разрешить работать дольше, разница будет меньше. (В зависимости от того, насколько плохую реализацию bash вы используете, и относительной скорости процессора и диска, вы можете даже не насыщать дисковый ввод-вывод bash).