GNU/Linux >> Znalost Linux >  >> Linux

Jaký je nejrychlejší způsob spuštění skriptu?

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 .

  1. 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
    
  2. 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
    
  3. 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...


Linux
  1. Co dělá Echo $? Dělat??

  2. Jak zajistit, aby skript Shell vždy běžel jako root?

  3. Jaký je nejlepší způsob, jak zajistit, aby byla spuštěna pouze jedna instance skriptu Bash?

  1. Linux – Jak spustit skript na obrazovce uzamčení/odemknutí?

  2. „Správný“ způsob, jak otestovat, zda služba běží ve skriptu?

  3. Znovu spustit skript, pokud je vstup Ano?

  1. Nejrychlejší způsob, jak extrahovat Iso?

  2. K jakému účelu slouží Colon Builtin „:“?

  3. Jaký je správný způsob použití inotify?