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 yeszapisuje 11504640linie w sekundę, podczas gdy ja mogę pisać tylko 1953linie w 5 sekund przy użyciu bash fori 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 yesktórego można napisać około 11 milionów wierszy na sekundę!
Więc jak yeszapisuje się do pliku tak szybko?
datejest to nieco ciężkie, a ponadto powłoka musi ponownie otworzyć strumień wyjściowy echodla 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.
datemoż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ż timeoutpolecenie 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 datena 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).