Fiquei me perguntando se existem diretrizes gerais para otimizar scripts Bash.
Por exemplo, é mais conveniente escrever loops do que linhas de comandos, mas também é mais rápido processar o sistema? Exemplo:
for i in a b c; do echo $i; done echo a echo b echo c
Às vezes, as pessoas apresentam soluções diferentes para o mesmo problema. Por exemplo,
sed
,cut
,awk
, eecho
são todos capazes de tirar dígitos a partir de uma string. Eu queria saber se você pode dizer que quanto menos código de dígitos tiver, mais rápido será se você usar:o mesmo comando, por exemplo
STRING=abc.def echo ${STRING} | sed 's/.def//g' echo ${STRING} | sed '$s/....$//'
comandos diferentes, por exemplo
STRING=abc.def echo ${STRING} | cut -d . -f 1 echo ${STRING} | sed 's/.def//g'
shell-script
Vincent
fonte
fonte
Respostas:
Os shells não fazem nenhuma reorganização do código que recebem, é apenas interpretado uma linha após a outra (nada mais faz muito sentido em um interpretador de comando). Grande parte do tempo gasto pelo shell vai para análise / análise / lançamento lexical dos programas chamados.
Para operações simples (como as que mostram os exemplos no final da pergunta), eu ficaria surpreso se o tempo para carregar os programas não varresse diferenças minúsculas de velocidade.
A moral da história é que, se você realmente precisa de mais velocidade, é melhor usar uma linguagem (semi) compilada como Perl ou Python, que é mais rápida de executar no início, na qual é possível escrever muitas das operações mencionadas diretamente e não precisa chamar programas externos e tem a opção de chamar programas externos ou chamar módulos C (ou o que seja) otimizados para executar grande parte do trabalho. Essa é a razão pela qual no Fedora o "açúcar de administração do sistema" (GUIs, essencialmente) é escrito em Python: Pode adicionar uma GUI agradável sem muito esforço, rápido o suficiente para tais aplicativos, ter acesso direto às chamadas do sistema. Se a velocidade não for suficiente, pegue C ++ ou C.
Mas não vá lá, a menos que você possa provar que o ganho de desempenho vale a perda de flexibilidade e o tempo de desenvolvimento. Os scripts do shell não são tão ruins de ler, mas estremeço quando me lembro de alguns scripts usados para instalar o Ultrix que tentei decifrar. Eu desisti, muita "otimização de script de shell" havia sido aplicada.
fonte
A primeira regra da otimização é: não otimize . Teste primeiro. Se os testes mostrarem que seu programa está muito lento, procure possíveis otimizações.
A única maneira de ter certeza é fazer benchmark para o seu caso de uso. Existem algumas regras gerais, mas elas se aplicam apenas a volumes típicos de dados em aplicativos típicos.
Algumas regras gerais que podem ou não ser verdadeiras em qualquer circunstância específica:
echo $foo
é mais lento queecho "$foo"
, porque sem aspas duplas, ele se divide$foo
em palavras e interpreta cada palavra como um padrão curinga de nome de arquivo. Mais importante, esse comportamento de divisão e globbing raramente é desejado. Portanto, lembre-se de sempre colocar aspas duplas em torno de substituições de variáveis e substituições de comandos:"$foo"
,"$(foo)"
.cut
ouhead
podem ser emuladassed
, massed
serão mais lentas e maisawk
lentas. O processamento de cadeia de shell é lento, mas para cadeias curtas é melhor do que chamar um programa externo.É raro que o desempenho seja uma preocupação nos scripts de shell. A lista acima é meramente indicativa; é perfeitamente bom usar métodos "lentos" na maioria dos casos, pois a diferença costuma ser uma fração de um por cento.
Normalmente, o objetivo de um script de shell é fazer algo rapidamente. Você precisa ganhar muito com a otimização para justificar gastar minutos extras escrevendo o script.
fonte
python
eruby
definitivamente seja mais lento, pelo menos no meu sistema,perl
é tão rápido quantobash
ouksh
. O GNU awk é significativamente mais lento que o GNU sed, especialmente em locais utf-8, mas não é verdade para todos os awks e todos os seds. o ksh93> dash> pdksh> zsh> bash nem sempre é tão claro quanto isso. Algumas conchas são melhores em algumas coisas que outras, e o vencedor nem sempre é o mesmo.Roubado de erros comuns de script de shell por Pádraig Brady.
fonte
for i in *; do wc -l "$i">/dev/null; done
fazer melhorfor i in *; do wc -l "$i"; done>/dev/null
.time
cmdwc -l
, verifique Eu atualizei na pós sua saída