Zastanawiałem się, jaki jest najszybszy sposób uruchomienia skryptu, czytałem, że istnieje różnica w szybkości między wyświetlaniem wyniku skryptu na terminalu, przekierowywaniem go do pliku, a może /dev/null
.
Jeśli wynik nie jest ważny, jaki jest najszybszy sposób na szybsze działanie skryptu, nawet jeśli jest minimalny.
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Odpowiedzi:
Terminale w dzisiejszych czasach są wolniejsze niż kiedyś, głównie dlatego, że karty graficzne nie dbają już o przyspieszenie 2D. Rzeczywiście, drukowanie na terminalu może spowolnić skrypt, szczególnie przy przewijaniu.
W konsekwencji
./script.sh
jest wolniejszy niż ten./script.sh >script.log
, który z kolei jest wolniejszy niż/script.sh >/dev/null
, ponieważ te ostatnie wymagają mniej pracy. Jednak to, czy stanowi to wystarczającą różnicę dla jakiegokolwiek praktycznego celu, zależy od tego, ile danych wyjściowych tworzy skrypt i jak szybko. Jeśli skrypt zapisuje 3 wiersze i kończy pracę lub jeśli drukuje 3 strony co kilka godzin, prawdopodobnie nie musisz zawracać sobie głowy przekierowaniami.Edycja: Niektóre szybkie (i całkowicie zepsute) testy porównawcze:
W konsoli Linux 240x75:
W
xterm
260x78:Przekieruj do pliku na dysku Samsung SSD 850 PRO 512GB:
Przekieruj do
/dev/null
:źródło
timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
drukuje ponad 100000 linii w ciągu jednej sekundy na moim MBP.)xterm
że na HP Apollo od 30 lat temu czołgano się w porównaniu doxterms
HP-UX sprzed 20 lat. Jednak konsola Linux z kartą wideo Matrox sprzed 15 lat była wolniejsza niż ta sama konsola Linux z kartą S3 sprzed 20 lat. Konsola Linux z buforem klatek o wysokiej rozdzielczości na nowoczesnej karcie jest po prostu bezużyteczna. :)Instynktownie zgodziłbym się z odpowiedzią Satō Katsury; to ma sens. Jednak testowanie jest dość łatwe.
Testowałem pisanie miliona linii na ekranie, pisanie (dołączanie) do pliku i przekierowywanie do
/dev/null
. Przetestowałem kolejno każdy z nich, a następnie wykonałem pięć powtórzeń. To są polecenia, których użyłem.Następnie narysowałem poniżej całkowite czasy.
Jak widać, założenia Satō Katsury były prawidłowe. Zgodnie z odpowiedzią Satō Katsury wątpię również, że czynnikiem ograniczającym będzie wyjście, więc jest mało prawdopodobne, aby wybór wyniku miał znaczący wpływ na ogólną szybkość skryptu.
FWIW, moja pierwotna odpowiedź miała inny kod, w którym plik był dołączany i
/dev/null
przekierowywał się w pętli.Jak zauważa John Kugelman w komentarzach, powoduje to znaczne obciążenie. W chwili obecnej pytanie nie jest tak naprawdę dobrym sposobem na przetestowanie go, ale zostawię go tutaj, ponieważ wyraźnie pokazuje koszt wielokrotnego otwierania pliku z poziomu samego skryptu.
W takim przypadku wyniki są odwrócone.
źródło
xterm
, co z kolei jest ~ 3 razy wolniejsze niż/dev/null
.Innym sposobem na przyspieszenie skryptu jest użycie szybszego interpretera powłoki. Porównać prędkości o POSIX zajęty pętli, działającego pod
bash
v4.4 ,ksh
v93u + 20120801 idash
v0.5.8 .bash
:Wydajność:
ksh
:Wydajność:
dash
:Wydajność:
Podzbiór poleceń w
bash
iksh
są wstecznie kompatybilne do wszystkich poleceńdash
.bash
Skrypt, który wykorzystuje tylko polecenia w tej podgrupie powinien pracowaćdash
.Niektóre
bash
skrypty korzystające z nowych funkcji można przekonwertować na innego tłumacza. Jeślibash
skrypt w dużej mierze opiera się na nowszych funkcjach, może nie być to warte zawracania głowy - niektóre nowebash
funkcje to ulepszenia, które są zarówno łatwiejsze do kodowania, jak i bardziej wydajne (pomimobash
ogólnie wolniejszego), dzięki czemu ichdash
odpowiednik (który może wymagać uruchomienia kilka innych poleceń), byłoby wolniejsze.W razie wątpliwości uruchom test ...
źródło