У нас есть готовый код, который загружает данные из файлов в базу данных. Существует несколько форматов файлов; все они являются полями фиксированной ширины.
Часть кода использует функцию 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.
ИЗМЕНИТЬ:
В случае, если это имеет значение
$ perl -v
This is perl, v5.8.0 built for PA-RISC1.1