Производительность сложна. Единственный способ убедиться в этом - провести тест на реальной системе с реальной нагрузкой.
Трубопровод нескольких инженерных сетей определенно требует затрат. По сравнению со строковыми операциями эта стоимость очень высока. Однако, если объем данных достаточно велик, решение конвейера может быть быстрее, потому что оно может позволить специализированным инструментам выполнять свою работу быстрее и может допускать параллельную обработку данных (если машина многоядерная и имеется достаточно полезной обработки, которая может делаться параллельно, чтобы было целесообразно). Но если объем данных невелик, затраты на запуск программ преобладают. Момент изменения доминирующего фактора очень зависит от системы и сценария использования.
Вообще говоря, чем универсальнее инструмент, тем он медленнее. Итак, если у вас есть задача, которую может выполнить grep
или head
, то обычно sed
также может это сделать, но не так быстро; а awk
будет еще медленнее. Это просто практическое правило; если вы пойдете искать, вы сможете найти конкретные реализации и конкретные рабочие нагрузки, в которых awk или sed превосходят другие инструменты. Объем данных должен быть достаточно большим, чтобы разница вообще была заметна.
Для небольших объемов данных количество запусков процессов является доминирующей стоимостью. Вообще говоря, чем более универсален инструмент, тем медленнее он запускается. Запуск нескольких инструментов сам по себе снижает производительность, потому что это означает, что в память нужно загружать больше кода. Однако, если вы используете BusyBox, где все инструменты сгруппированы в один исполняемый файл, этот аспект сводится к минимуму.
Начиная с
cat file | grep ^field | head -n1 | sed 's/:/ /' | awk '{print $1}'
вызов cat
бесполезен и не может улучшить производительность. Использование поля grep ^ | голова -n1 | sed 's /: / /'
может иметь небольшое преимущество, если объем данных очень большой, но в большинстве сценариев я бы ожидал, что
<file sed -n '/^field/ { s/:/ /p; q; }'
будет быстрее, потому что он позволяет избежать ожидания нескольких процессов.
Что касается вызова awk, то здесь он просто не нужен. Если нет начальных двоеточий, то команда эквивалентна
<file sed -n '/^field/ { s/:.*//p; q; }'
или, если grep
имеет преимущество,
<file grep '^field' | sed -e 's/:.*//' -e 'q'
И если есть ведущие двоеточия, просто добавьте s / ^ :: * //
в начале команды sed
.
Я обнаружил, что пакет решения-bash-completion
никогда не устанавливался на ноутбук.
Это вводящая в заблуждение проблема, потому что в .bashrc
источник файла указан правильно, и он не выдает ошибку. Однако файл никогда не существовал.
Однако bashrc проверяет /usr/share/bash -завершение/bash _завершение, которое существует. Почему не работает, не знаю.
sudo apt install bash-completion
устраняет проблему.