Como comparar diferentes shells [closed]

1

Eu quero saber se o shell 1 é melhor para um trabalho do que o shell 2 com um teste que eu manipulo, talvez com o shell 3, por exemplo, ksh, dash, bash ou zsh. Eu uso um script de teste que constrói meus projetos, inicia, alimenta a entrada via padrão e analisa o comportamento do shell com Valgrind para obter rastros muito informativos do que o código está fazendo. Agora eu me pergunto se você pode me ajudar com bons comandos de shell para testar se eu quiser fazer benchmark entre 2 shells e mais pipelines complicados, já que eu fiz principalmente casos de teste com pipelines randon não-triviais.

Eu posso imaginar um grande trabalho usando arquivos grandes - é uma boa maneira de saber qual shell é "mais rápido" fazendo um trabalho caro ou é uma questão de expor um script de shell grande?

O shell que eu quero testar pode receber entrada como neste script e o Valgrind pode medir problemas de alinhamento de dados ou outros erros ao testar pipelines caros.

Você conhece um bom script de shell para comparar diferentes shells?

#!/bin/sh
echo "-- Testing our implementation of POSIX shell --"
echo ""
echo "- If you have any problem in passing a test read the corresponding"
echo "- source file to understand what the test is checking"
echo ""
printf "********************* PRESS ENTER TO RUN TESTS  ... "
#read _
make
valgrind --leak-check=yes ./shell .<< EOF
ls -al|grep open|awk '{print \}'
EOF
printf "********************* TEST WILDCARDS \n***** Press any key to listing all files in current directory...\nYou should see filesnames *.* below "
read _
./shell << EOF
ls
EOF
printf "********************* TEST ALGORITHMS ...  \n***** Press any key to run the algorithms... .\nYou should see the output from top -b -n1|head -8|tail -1 "
read _
valgrind --leak-check=yes ./shell .<< EOF
top|head -8|tail -1|sort -n|wc -l
EOF

printf "********************* TEST ALGORITHMS Part II.  ... .\nYou should see the output from who|awk '{print \ ; print \}'|sort -n|wc -l. "
read _
valgrind --leak-check=yes ./shell .<< EOF
who|awk '{print \ ; print \}'|sort -n|wc -l
EOF

printf "********************* TEST CHECKENV.  ..... .\nYou should see the output checkenv below "
read _
valgrind --leak-check=yes ./shell .<< EOF
checkenv
EOF
printf "********************* TEST DONE. YOU SHOULD SEE OUTPUT FROM TEST ABOVE ... "
read _
    
por Niklas Rosencrantz 05.05.2016 / 23:40

2 respostas

2

A chave para o desempenho do shell é minimizar o número de chamadas caras do sistema, em particular fork() e exec() .

Não use grep ou sed dentro de um loop de shell. Nunca use um pipeline com ambos; na maioria dos casos, pode ser reduzido para apenas sed ou awk .

Se ficar complicado, use uma linguagem que analise expressões regulares, e faça loops, como ou .

Por outro lado, se você conseguir com o processamento de texto simples oferecido pelo shell, você pode extrair muito desempenho dele.

Dito isto, o at & ksh93 sempre foi otimizado para velocidade, enquanto o bash e o zsh têm muito mais recursos.

    
por 06.05.2016 / 20:45
1
for shell in $(sed '1d' /etc/shells); do # or use your own list of shells
    echo "$shell -"
    time $shell /path/to/script
done
    
por 06.05.2016 / 01:41