Podam przykład:
$ 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
Tutaj możesz zobaczyć, że polecenie yes
zapisuje 11504640
linie w sekundę, podczas gdy ja mogę pisać tylko 1953
linie w 5 sekund przy użyciu bash for
i echo
.
Jak sugerowano w komentarzach, istnieją różne sztuczki, aby uczynić go bardziej wydajnym, ale żadne z nich nie jest zbliżone do prędkości 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
Mogą napisać do 20 tysięcy wierszy na sekundę. Można je dodatkowo ulepszyć, aby:
$ 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
To daje nam do 40 tysięcy linii na sekundę. Lepiej, ale wciąż daleko, z yes
którego można napisać około 11 milionów wierszy na sekundę!
Więc jak yes
zapisuje się do pliku tak szybko?
date
jest to nieco ciężkie, a ponadto powłoka musi ponownie otworzyć strumień wyjściowy echo
dla każdej iteracji pętli. W pierwszym przykładzie jest tylko jedno wywołanie polecenia z jednym przekierowaniem wyjścia, a polecenie jest bardzo lekkie. Oba nie są w żaden sposób porównywalne.
date
może być ciężki, zobacz edytuj moje pytanie.
timeout 1 $(while true; do echo "GNU">>file2; done;)
jest niewłaściwym sposobem użycia, timeout
ponieważ timeout
polecenie uruchomi się dopiero po zakończeniu zastępowania polecenia. Użyj timeout 1 sh -c 'while true; do echo "GNU">>file2; done'
.
write(2)
wywołaniach systemowych, a nie na obciążeniach innymi syscallami, narzutami powłoki, a nawet tworzeniem procesów w pierwszym przykładzie (który działa i czeka date
na każdą linię wydrukowaną w pliku). Jedna sekunda pisania to zaledwie tyle, ile wynosi wąskie gardło we / wy dysku (zamiast procesora / pamięci) w nowoczesnym systemie z dużą ilością pamięci RAM. Gdyby pozwolić na dłuższą pracę, różnica byłaby mniejsza. (W zależności od tego, jak źle używasz implementacji bash oraz względnej prędkości procesora i dysku, możesz nawet nie nasycić dysku we / wy dyskiem bash).