Primeiro, vamos nos concentrar no desempenho. Eu executei benchmarks para um programa ligeiramente diferente em um processador x86_64 de outra forma ocioso, rodando Debian squeeze.
herestring.bash
, usando um heráldico para passar uma linha de entrada:
#! /bin/bash
i=0
while [ $i -lt $1 ]; do
tr a-z A-Z <<<'hello world'
i=$((i+1))
done >/dev/null
heredoc.bash
, usando um heredoc para passar uma linha de entrada:
#! /bin/bash
i=0
while [ $i -lt $1 ]; do
tr a-z A-Z <<'EOF'
hello world
EOF
i=$((i+1))
done >/dev/null
echo.bash
, usando echo
e um pipe para passar uma linha de entrada:
#! /bin/bash
i=0
while [ $i -lt $1 ]; do
echo 'hello world' | tr a-z A-Z
i=$((i+1))
done >/dev/null
Para comparação, também sincronizei os scripts em ATT ksh93 e under dash (exceto por herestring.bash
, porque dash não possui herestrings).
Aqui estão uma média de três vezes:
$ time bash ./herestring.bash 10000
./herestring.bash 10000 0.32s user 0.79s system 15% cpu 7.088 total
$ time ksh ./herestring.bash 10000
ksh ./herestring.bash 10000 0.54s user 0.41s system 17% cpu 5.277 total
$ time bash ./heredoc.bash 10000
./heredoc.bash 10000 0.35s user 0.75s system 17% cpu 6.406 total
$ time ksh ./heredoc.bash 10000
ksh ./heredoc.sh 10000 0.54s user 0.44s system 19% cpu 4.925 total
$ time sh ./heredoc.bash 10000
./heredoc.sh 10000 0.08s user 0.58s system 12% cpu 5.313 total
$ time bash ./echo.bash 10000
./echo.bash 10000 0.36s user 1.40s system 20% cpu 8.641 total
$ time ksh ./echo.bash 10000
ksh ./echo.sh 10000 0.47s user 1.51s system 28% cpu 6.918 total
$ time sh ./echo.sh 10000
./echo.sh 10000 0.07s user 1.00s system 16% cpu 6.463 total
Conclusões:
- Um heredoc é mais rápido que um heredring.
-
echo
e um canal é notavelmente, mas não dramaticamente mais rápido. (Lembre-se de que se trata de um programa de brinquedo: em um programa real, a maior parte do tempo de processamento estaria em qualquer que seja atr
chamada aqui.) - Se você quiser velocidade, valide bash e call dash ou melhor ainda ksh. Os recursos do Bash não compensam sua relativa lentidão, mas o ksh tem recursos e velocidade.
Além do desempenho, também há clareza e portabilidade. <<<
é uma extensão ksh93 / bash / zsh que é menos conhecida que echo … |
ou <<
. Não funciona no ksh88 / pdksh ou no POSIX sh.
O único local em que <<<
é significativamente mais claro está dentro de um heredoc:
foo=$(tr a-z A-Z <<<'hello world')
vs
foo=$(tr a-z A-Z <<'EOF'
hello world
EOF
)
(A maioria dos shells não consegue lidar com o fechamento dos parênteses no final da linha contendo <<EOF
.)