В данном конкретном случае лучше использовать второй вариант.
Как правило, более эффективно минимизировать количество утилит в конвейере. Лучше не разветвлять (запускать) ненужные процессы (как в вашем первом примере с ненужным процессом sed
).В Интернете нетрудно найти примеры жалоб на бесполезное использование cat.
В большинстве современных Unix-подобных систем* разветвление осуществляется достаточно эффективно, но это зависит от размера запускаемого процесса, например, запуск perl
или python
будет намного медленнее, чем sed
или awk
.
Для однократных команд это не имеет большого значения, но если конвейер находится внутри цикла и выполняется много раз, удаление ненужного процесса из конвейера может значительно ускорить общее время выполнения.
Почему я должен запускать один из них?
Если вы лучше знакомы с синтаксисом одного над другим, это может быть лучше для читаемости кода (и ремонтопригодности) использовать инструмент/язык вы наиболее знакомы с.
Должен ли я использовать другой инструмент?
В данном конкретном случае я бы так не думал. Оба awk
и sed
являются
подходящие инструменты для такого рода работ.
Какие факторы следует учитывать?
Если вам нужно обрабатывать несколько файлов (например, в цикле), то скорость/эффективность будут важны.
Если вы время от времени обрабатываете один большой файл, удобочитаемость кода может быть важнее.
Как я могу проверить эти факторы?
Вы можете профилировать разные версии с помощью утилиты time
, доступной как встроенная оболочка с Bash, но также и как отдельная исполняемая программа. Например. выполнение двух примеров команд показывает, что первый пример занял .012s длиннее второго.
$ time echo "foo\nbar\nbaz" | sed 1q | awk '{ print $0 " cats" }'
foo\nbar\nbaz cats
real 0m0.056s
user 0m0.000s
sys 0m0.045s
$ time echo "foo\nbar\nbaz" | awk 'NR == 1 { print $0 " cats" }'
foo\nbar\nbaz cats
real 0m0.044s
user 0m0.000s
sys 0m0.031s
Обратите внимание, что на профилирование тестов влияет нагрузка на систему и другие ограничивающие факторы, поэтому вам придется повторять это большое количество раз, чтобы получить истинное представление о том, какая версия быстрее другой.
*В MS Windows разветвление обходится дороже, поэтому минимизация количества запускаемых процессов имеет значение при работе в таких средах, как Cygwin.
Итак, jasonwryan в основном прокомментировал ответ, который я искал здесь. Патч применяется к ядру Linux, которое можно скомпилировать и использовать для любого дистрибутива. Он связал меня с парой замечательных статей, в том числе с тем же руководством Arch Linux по ядрам .
Когда я задал этот вопрос, у меня не было достаточно знаний о ядре, чтобы понять, как применяется этот патч, но спасибо ему за то, что он направил меня на правильный путь.