Есть несколько способов ускорить выполнение вашей оболочки (например, Bash).
sed
, grep
, awk
и т.д. для обработки строк / текста
. command | grep | grep | cut | sed
замедляет ваш код. Каждая труба - это накладные расходы.
В этом примере все они выполняются одной awk.
команда | awk '{сделайте все здесь}'
Самый близкий инструмент, который вы можете использовать, который может соответствовать скорости Perl для определенных задач, например, обработки строк или математики, - это awk. Вот забавный тест для этого решения . В файле около 9 миллионов чисел Вывод
$ head -5 file
1
2
3
34
42
$ wc -l <file
8999987
# time perl -nle '$sum += $_ } END { print $sum' file
290980117
real 0m13.532s
user 0m11.454s
sys 0m0.624s
$ time awk '{ sum += $1 } END { print sum }' file
290980117
real 0m9.271s
user 0m7.754s
sys 0m0.415s
$ time perl -nle '$sum += $_ } END { print $sum' file
290980117
real 0m13.158s
user 0m11.537s
sys 0m0.586s
$ time awk '{ sum += $1 } END { print sum }' file
290980117
real 0m9.028s
user 0m7.627s
sys 0m0.414s
Для каждой попытки awk быстрее Perl.
Наконец, постарайтесь выучить awk за пределами того, что они могут делать в одиночку.
Это может оказаться опасно близким к оптимизации в кресле, но вот несколько идей, которые могут рационализировать ваши результаты:
Fork / exec: почти все полезное, что выполняется сценарием оболочки, выполняется через оболочку, который запускает новую оболочку и выполняет команду, такую как sed
, awk
, cat
и т. д. Чаще всего выполняется более одного процесса, и данные перемещаются по трубам.
Структуры данных: структуры данных Perl более сложные, чем структуры Bash или Csh. Обычно это заставляет программиста работать с хранилищем данных. Это может принимать следующие формы:
Неоптимизированная реализация: некоторые конструкции оболочки могут быть спроектированы не с учетом оптимизации, а с учетом удобства пользователя. Например, у меня есть основания полагать, что реализация bash расширения параметров, в частности $ {foo // search / replace}
, является неоптимальной по сравнению с той же операцией в sed
. Обычно это не проблема для повседневных задач.
Нет, я думаю, что это невозможно:
Команда bash - это действительно интерпретируемый язык, но программы Perl компилируются в байт-код перед выполнением
Да. Код C будет быстрее, чем код Perl для того же самого, поэтому сценарий, который использует скомпилированный исполняемый файл для выполнения большого количества работы, будет быстрее, чем программа Perl, выполняющая то же самое.
Конечно, программа Perl может быть переписана для использования исполняемого файла, и в этом случае она, вероятно, снова будет быстрее.
Некоторые команды оболочки в некоторых ситуациях могут выполняться быстрее, чем Perl. Однажды я сравнил простой скрипт sed с эквивалентом в Perl, и sed победил. Но когда требования стали более сложными, версия на perl начала превосходить версию sed. Так что ответ в зависимости от обстоятельств. Но по другим причинам (простота, ремонтопригодность и т. Д.) Я все равно склоняюсь к тому, чтобы делать что-то на Perl, если только требования не очень простые, и я ожидаю, что они останутся такими.