Perl нелепо быстрее, чем Bash. А для манипулирования текстом на самом деле вы можете добиться лучших результатов с Perl, чем с C, если вы не тратите время на написание сложных алгоритмов. Конечно, для простых вещей C может быть непобедимым.
Тем не менее, если ваш сценарий "bash" не зацикливается, а просто вызывает другие программы, тогда никакой выгоды не будет. Например, если ваш скрипт выглядит как "cat X | grep Y | tr -f 3-5 | sort | uniq
", то большую часть времени тратится на cat, grep, tr, sort и uniq, НЕ на Bash.
Вы получите производительность, если в скрипте есть какой-либо цикл, или если вы сохраните несколько чтений одного и того же файла.
Вы говорите, что вырезали вещи между двумя отметками времени в файле. Допустим, ваш скрипт на Bash выглядит так:
LINE1=`grep -n TIMESTAMP1 filename | head -1 | cut -d ':' -f 1`
LINE2=`grep -n TIMESTAMP2 filename | head -1 | cut -d ':' -f 1`
tail +$LINE1 filename | head -$(($LINE2-$LINE1))
Тогда вы увеличите производительность, потому что вы читаете весь файл три раза: один раз для каждой команды, где появляется «имя файла». В Perl вы бы сделали что-то вроде этого:
my $state = 0;
while(<>) {
exit if /TIMESTAMP2/;
print $_ if $state == 1;
$state = 1 if /TIMESTAMP1/;
}
Это прочитает файл только один раз, а также остановится, как только вы прочитаете TIMESTAMP2. Поскольку вы обрабатываете несколько файлов, вы должны использовать «last» или «break» вместо «exit», чтобы скрипт мог продолжать обрабатывать файлы.
В любом случае, увидев ваш сценарий, я уверен, что вы многое выиграете, переписав его на Perl. Несмотря на циклы, связанные с именами файлов (скорость которых будет улучшена, но, вероятно, незначительна), для каждого файла, который не полностью находится внутри или вне области действия, которую вы делаете:
- Прочитайте ВЕСЬ файл для подсчета строк!
- Делать несколько хвостов в файле
- Завершить "head" или "tail" файл еще раз
Кроме того, возглавьте свои хвосты. Каждый раз, когда вы делаете это, какой-то фрагмент кода читает эти данные. Некоторые из этих строк читаются до 10 или более раз!