Inzwischen ist die unbrauchbare Verwendung von cat
Awards sehr bekannt, und es wird auch eine unbrauchbare Verwendung vonecho
(für diese Frage nicht relevant) erwähnt. Ich frage mich, ob es einen "Useless Use of echo
in Bash Award" geben sollte: Piping scheint nach einigen hochgradig unwissenschaftlichen Messungen viel langsamer zu sein als Heredocs und Herestrings:
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
Herestrings
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
Umleitung
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
Im Allgemeinen haben Heredocs und Herestrings ungefähr dieselbe Geschwindigkeit (dies ist nur ein Datensatz aus mehreren Tests), während die Umleitung durchweg mehr als 50% langsamer ist. Verstehe ich etwas falsch oder kann dies als allgemeine Regel für Befehle zum Lesen von Standardeingaben in Bash verwendet werden?
cat <<END
vs. cat <<< "test string"
vs. echo "test string" | cat
oder cat <<'END'
vs. cat <<< 'test string'
vs. vergleichen sollten echo 'test string' | cat
, um die gleiche Anzahl von Erweiterungen zu erhalten, die von der Shell für die Zeichenfolgen ausgeführt werden.
$(seq $reps)
?
seq
" der Auszeichnung ;-)