En este momento, el uso inútil del cat
premio es muy conocido, y también se menciona el uso inútil deecho
(no relevante para esta pregunta). Me pregunto si debería haber un "Premio al uso inútil echo
en Bash": las tuberías parecen ser mucho más lentas que los heredocs y los herejes según algunas mediciones muy poco científicas:
Heredocs:
for reps in 1 2 3 do time for i in {1..1000} do cat <<'END' test string END done > /dev/null done real 0m1.786s user 0m0.212s sys 0m0.332s real 0m1.817s user 0m0.232s sys 0m0.332s real 0m1.846s user 0m0.256s sys 0m0.320s
Herejías
for reps in 1 2 3 do time for i in {1..1000} do cat <<< 'test string' done > /dev/null done real 0m1.932s user 0m0.280s sys 0m0.288s real 0m1.956s user 0m0.248s sys 0m0.348s real 0m1.968s user 0m0.268s sys 0m0.324s
Redireccionamiento
for reps in 1 2 3 do time for i in {1..1000} do echo 'test string' | cat done > /dev/null done real 0m3.562s user 0m0.416s sys 0m0.548s real 0m3.924s user 0m0.384s sys 0m0.604s real 0m3.343s user 0m0.400s sys 0m0.552s
En general, los heredocs y herestrings tienen aproximadamente la misma velocidad (este es solo un conjunto de datos de varias pruebas), mientras que la redirección es consistentemente un 50% más lenta. ¿Estoy malinterpretando algo, o podría usarse esto como una regla general para los comandos que leen la entrada estándar en Bash?
cat <<END
frente a cat <<< "test string"
frente echo "test string" | cat
o cat <<'END'
frente a cat <<< 'test string'
frente echo 'test string' | cat
para tener la misma cantidad de expansiones realizadas por la concha en las cuerdas.
$(seq $reps)
?
seq
premio de " uso inútil de " ;-)