Loops de shell são lentos e os de bash são os mais lentos.
As conchas não são destinadas a fazer trabalhos pesados em loops. Os shells servem para lançar alguns processos externos otimizados em lotes de dados.
De qualquer forma, eu estava curioso para saber como os loops de shell são comparados, então fiz uma pequena referência:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
Detalhes:
- CPU: CPU Intel (R) Core (TM) i5 M 430 @ 2,27 GHz
- ksh: versão sh (Pesquisa AT & T) 93u + 2012-08-01
- bash: GNU bash, versão 4.3.11 (1) -release (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-desconhecido-linux-gnu)
- traço: 0.5.7-4ubuntu1
Os resultados (abreviados) (tempo por iteração) são:
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
Dos resultados:
Se você quiser um loop de shell um pouco mais rápido, se tiver a sintaxe [[
e desejar um loop de shell rápido, estará em um shell avançado e também terá o loop C para loop. Use o C como loop, então. Eles podem ser cerca de 2 vezes mais rápidos que while [
-loops no mesmo shell.
-
O ksh tem o loop
for (
mais rápido em torno de 2,7µs por iteração
-
traço tem o loop
while [
mais rápido em torno de 5.8µs por iteração
C para loops pode ser de 3 a 4 ordens de magnitude decimal mais rápido. (Eu ouvi os Torvalds amam C).
O loop C for otimizado é 56500 vezes mais rápido que o loop while [
do bash (o loop de shell mais lento) e 6750 vezes mais rápido que o loop for (
do ksh (o loop de shell mais rápido).
Mais uma vez, a lentidão das shells não deve importar muito, porque o padrão típico com shells é descarregar para alguns processos de programas externos e otimizados.
Com esse padrão, os shells geralmente tornam muito mais fácil escrever scripts com desempenho superior aos scripts python (da última vez que verifiquei, criar pipelines de processo em python era bastante desajeitado).
Outra coisa a considerar é o tempo de inicialização.
time python3 -c ' '
leva de 30 a 40 ms no meu PC, enquanto que os shells demoram cerca de 3ms. Se você lançar muitos scripts, isso se soma rapidamente e você pode fazer muito nos 27 a 37 ms que o python leva apenas para iniciar. Pequenos scripts podem ser concluídos várias vezes nesse período de tempo.
(NodeJs é provavelmente o pior tempo de execução de script neste departamento, já que leva apenas cerca de 100ms para ser iniciado (embora uma vez tenha sido iniciado, seria difícil encontrar um melhor desempenho entre as linguagens de script).