Пример ниже удивил меня. Кажется, это противоречит интуиции ... кроме того факта, что у комбо больше времени для пользователяecho | sed
.
Почему echo
используется так много системного времени, когда он работает один, или должен быть вопрос: как sed
меняется состояние игры? Похоже, что в обоих случаях echo
нужно повторить одно и то же ...
time echo -n a\ {1..1000000}\ c$'\n' >file
# real 0m9.481s
# user 0m5.304s
# sys 0m4.172s
time echo -n a\ {1..1000000}\ c$'\n' |sed s/^\ // >file
# real 0m5.955s
# user 0m5.488s
# sys 0m1.580s
time echo ... |cat >file
и дажеtime echo ... |perl -ne 'print'
времена похожи наsed
версию.Ответы:
bahamat и Alan Curry правильно поняли: это связано с тем, как ваша оболочка буферизует вывод
echo
. В частности, ваша оболочка является bash и выдает одинwrite
системный вызов на строку. Следовательно, первый фрагмент выполняет 1000000 операций записи в файл на диске, тогда как второй фрагмент выполняет 1000000 операций записи в канал, а sed (в основном параллельно, если у вас несколько ЦП) выполняет значительно меньшее количество операций записи в файл диска из-за его вывода. буферизация.Вы можете наблюдать, что происходит, запустив strace .
Другие оболочки, такие как ksh, буферизуют вывод
echo
даже тогда, когда он многострочный, поэтому вы не увидите большой разницы.С bash я получаю аналогичные временные соотношения. С помощью ksh я вижу, что второй фрагмент работает медленнее.
источник
ksh
пример больше соответствует тому, что я ожидал ...