У нас есть зрелый код, который загружает данные из файлов в базу данных. Существует несколько форматов файлов; все поля фиксированной ширины.Как ускорить обработку данных фиксированной ширины Perl?
Часть кода использует функцию Perl unpack()
для чтения полей из входных данных в переменные пакета. Бизнес-логика тогда может обращаться к этим полям «с точки зрения человека».
Код чтения файла создается из описания формата один раз, перед чтением файла.
В эскизе формы, сгенерированный код выглядит следующим образом:
while (<>) {
# Start of generated code.
# Here we unpack 2 fields, real code does around 200.
($FIELDS::transaction_date, $FIELDS::customer_id) = unpack q{A8 A20};
# Some fields have leading space removed
# Generated code has one line like this per affected field.
$FIELDS::customer_id =~ s/^\s+//;
# End of generated code.
# Then we apply business logic to the data ...
if ($FIELDS::transaction_date eq $today) {
push @fields, q{something or other};
}
# Write to standard format for bulk load to the database.
print $fh join('|', @fields) . q{\n} or die;
}
Профилирование кода показывает, что около 35% времени тратится на распаковке и ведущее пространство полоса. Оставшееся время тратится на проверку и преобразование данных и запись в выходной файл.
Похоже, что нет единой части бизнес-логики, которая занимает более 1-2% от времени выполнения.
Вопрос: можем ли мы немного ускорить процесс распаковки и снятия пространства? Предпочтительно без необходимости рефакторировать весь код, который относится к переменным пакета FIELDS.
EDIT:
В случае это разница
$ perl -v
This is perl, v5.8.0 built for PA-RISC1.1
Было бы интересно узнать, будет ли оптимальным использование списка переменных пакета в левой части распаковки. –