Terminály jsou v dnešní době pomalejší, než bývaly, a to především proto, že grafické karty se již nestarají o 2D akceleraci. Tisk na terminál tedy skutečně může zpomalit skript, zvláště když se jedná o rolování.
Následně ./script.sh
je pomalejší než ./script.sh >script.log
, což je zase pomalejší než /script.sh >/dev/null
, protože to druhé vyžaduje méně práce. Zda to však znamená dostatečný rozdíl pro jakýkoli praktický účel, závisí na tom, kolik výstupu váš skript produkuje a jak rychle. Pokud váš skript napíše 3 řádky a skončí, nebo pokud vytiskne 3 stránky každých pár hodin, pravděpodobně se nemusíte obtěžovat s přesměrováním.
Upravit: Několik rychlých (a zcela nefunkčních) benchmarků:
-
V linuxové konzoli 240x75:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done) real 3m52.053s user 0m0.617s sys 3m51.442s
-
V
xterm
, 260x78:$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done) real 0m1.367s user 0m0.507s sys 0m0.104s
-
Přesměrování do souboru na disku Samsung SSD 850 PRO 512 GB:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >file) real 0m0.532s user 0m0.464s sys 0m0.068s
-
Přesměrujte na
/dev/null
:$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >/dev/null) real 0m0.448s user 0m0.432s sys 0m0.016s
Instinktivně bych souhlasil s odpovědí Satō Katsury; to dává smysl. Nicméně je to dost snadné na testování.
Testoval jsem zápis milionu řádků na obrazovku, zápis (připojování) do souboru a přesměrování na /dev/null
. Postupně jsem testoval každý z nich a poté jsem provedl pět opakování. Toto jsou příkazy, které jsem použil.
$ time (for i in {1..1000000}; do echo foo; done)
$ time (for i in {1..1000000}; do echo foo; done > /tmp/file.log)
$ time (for i in {1..1000000}; do echo foo; done > /dev/null)
Poté jsem vynesl celkové časy níže.
Jak vidíte, předpoklady Satō Katsury byly správné. Podle odpovědi Satō Katsura také pochybuji, že limitujícím faktorem bude výstup, takže je nepravděpodobné, že by výběr výstupu měl zásadní vliv na celkovou rychlost scénáře.
FWIW, moje původní odpověď měla jiný kód, který měl připojený soubor a /dev/null
přesměrovat uvnitř smyčka.
$ rm /tmp/file.log; touch /tmp/file.log; time (for i in {1..1000000}; do echo foo >> /tmp/file.log; done)
$ time (for i in {1..1000000}; do echo foo > /dev/null; done)
Jak John Kugelman zdůrazňuje v komentářích, přidává to spoustu režie. Jak otázka zní, toto opravdu není správný způsob, jak to otestovat, ale nechám to zde, protože to jasně ukazuje náklady na opakované otevírání souboru zevnitř samotný skript.
V tomto případě jsou výsledky obrácené.
Dalším způsobem, jak urychlit skript, je použití rychlejšího interpretu shellu. Porovnejte rychlosti POSIX zaneprázdněná smyčka, spusťte pod bash
verze 4.4 , ksh
v93u+20120801 a dash
v0.5.8 .
-
bash
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | bash -s > /dev/null
Výstup:
real 0m25.146s user 0m24.814s sys 0m0.272s
-
ksh
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | ksh -s > /dev/null
Výstup:
real 0m11.767s user 0m11.615s sys 0m0.010s
-
dash
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | dash -s > /dev/null
Výstup:
real 0m4.886s user 0m4.690s sys 0m0.184s
Podmnožina z příkazů vbash
a ksh
jsou zpětně kompatibilní se všemi příkazy v dash
. A bash
skript, který používá pouze příkazy v této podmnožině, by měl fungovat s dash
.
Nějaké bash
skripty, které používají nové funkce, lze převést na jiný interpret. Pokud bash
skript silně spoléhá na novější funkce, nemusí to stát za to se obtěžovat -- některé nový bash
funkce jsou vylepšení, která se snáze kódují a efektivnější (navzdory bash
je obecně pomalejší), takže dash
ekvivalentní (což může zahrnovat spuštění několika dalších příkazů), by bylo pomalejší.
V případě pochybností spusťte test...