К настоящему времени « Бесполезное использование cat
награды» очень хорошо известно, и есть также упоминание о « Бесполезном использовании»echo
(не относится к этому вопросу). Я задаюсь вопросом, должно ли быть «Бесполезное использование echo
в Bash Award»: трубопроводы, кажется, намного медленнее, чем heredocs и 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
Перенаправление
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
Как правило, heredocs и herestrings имеют примерно одинаковую скорость (это только один набор данных из нескольких тестов), в то время как перенаправление постоянно более чем на 50% медленнее. Я что-то неправильно понимаю, или это можно использовать как общее правило для команд, читающих стандартный ввод в Bash?
cat <<END
против cat <<< "test string"
против echo "test string" | cat
или cat <<'END'
против cat <<< 'test string'
против echo 'test string' | cat
иметь одинаковое количество разложения в исполнении оболочки на струнах.
$(seq $reps)
?
seq
» ;-)