Eu queria saber qual é a maneira mais rápida de executar um script, eu tenho lido que há uma diferença na velocidade entre mostrar a saída do script no terminal, redirecioná-lo para um arquivo ou talvez /dev/null
.
Portanto, se a saída não for importante, qual é a maneira mais rápida de fazer com que o script funcione mais rápido, mesmo que seja mínimo.
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Respostas:
Atualmente, os terminais estão mais lentos do que costumavam ser, principalmente porque as placas gráficas não se preocupam mais com a aceleração 2D. Portanto, a impressão em um terminal pode diminuir a velocidade de um script, principalmente quando a rolagem está envolvida.
Consequentemente,
./script.sh
é mais lento do que./script.sh >script.log
, o que, por sua vez, é mais lento do que/script.sh >/dev/null
, porque o último envolve menos trabalho. No entanto, se isso faz diferença suficiente para qualquer finalidade prática, depende da quantidade de saída produzida pelo script e da rapidez com que ela é produzida. Se o seu script gravar 3 linhas e sair, ou se imprimir 3 páginas a cada poucas horas, você provavelmente não precisará se preocupar com redirecionamentos.Edit: Alguns benchmarks rápidos (e completamente quebrados):
Em um console Linux, 240x75:
Em um
xterm
260x78:Redirecione para um arquivo em um disco Samsung SSD 850 PRO 512GB:
Redirecionar para
/dev/null
:fonte
timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
imprime 100000+ linhas num único segundo no meu MBP.)xterm
o HP Apollo de 30 anos atrás costumava rastrear em comparação com oxterms
HP-UX de 20 anos atrás. No entanto, um console Linux com uma placa de vídeo Matrox de 15 anos atrás era mais lento que o mesmo console Linux com uma placa S3 de 20 anos atrás. E um console Linux com buffer de quadros de alta resolução em uma placa moderna é simplesmente inutilizável. :)Eu teria concordado instintivamente com a resposta de Satō Katsura; faz sentido. No entanto, é fácil o suficiente para testar.
Testei escrevendo um milhão de linhas na tela, escrevendo (anexando) em um arquivo e redirecionando para
/dev/null
. Testei cada um deles por vez e depois fiz cinco repetições. Estes são os comandos que eu usei.Em seguida, plotei o total de vezes abaixo.
Como você pode ver, as presunções de Satō Katsura estavam corretas. De acordo com a resposta de Satō Katsura, também duvido que o fator limitante seja a saída, por isso é improvável que a escolha da saída tenha um efeito substancial na velocidade geral do script.
FWIW, minha resposta original tinha um código diferente, que tinha o arquivo anexado e
/dev/null
redirecionado dentro do loop.Como John Kugelman aponta nos comentários, isso acrescenta muita sobrecarga. Como a pergunta está, essa não é realmente a maneira correta de testá-la, mas vou deixá-la aqui, pois mostra claramente o custo de reabrir um arquivo repetidamente de dentro do próprio script.
Nesse caso, os resultados são revertidos.
fonte
xterm
, que por sua vez é ~ 3 vezes mais lento que/dev/null
.Outra maneira de acelerar um script é usar um interpretador de shell mais rápido. Comparar as velocidades de um POSIX circuito ocupado, executados sob
bash
v4.4 ,ksh
v93u + 20120801 , edash
v0.5.8 .bash
:Saída:
ksh
:Saída:
dash
:Saída:
Um subconjunto de comandos
bash
eksh
é retrocompatível com todos os comandos emdash
. Umbash
script que usa apenas comandos nesse subconjunto deve funcionardash
.Alguns
bash
scripts que usam novos recursos podem ser convertidos para outro intérprete. Se obash
script depende muito de recursos mais recentes, pode não valer a pena - alguns novosbash
recursos são aprimoramentos mais fáceis de codificar e mais eficientes (apesar debash
geralmente serem mais lentos), de modo que odash
equivalente (que pode envolver a execução vários outros comandos), seria mais lento.Em caso de dúvida, execute um teste ...
fonte