У меня есть парсер, написанный на Perl, который анализирует файл записей фиксированной длины. Часть записи состоит из нескольких строк (также фиксированной длины), состоящих только из чисел. Каждый символ в строке кодируется как число, а не как символ ASCII. I.e., если у меня есть строка 12345, она кодируется как 01 02 03 04 05 (вместо 31 32 33 34 35).производительность распаковки в сочетании с объединением в Perl
Я разбираю запись с распаковкой, и эта конкретная часть распакована как @array = unpack "C44", $s
. Затем я восстанавливаю необходимую строку с простым соединением, например $m = join("", @array)
.
Мне было интересно, если это оптимальный способ декодирования. Файлы довольно большие, миллионы записей, и, очевидно, я пытался посмотреть, можно ли оптимизировать. Профилировщик показывает, что большую часть времени тратится на разбор записей (т. Е. Чтение, письмо и другие вещи не проблема), и в синтаксическом анализе большую часть времени были предприняты этими объединениями. Я помню из других источников, что объединение - довольно эффективная операция. Любые идеи, если можно быстрее скопировать код или это уже оптимально? Возможно, можно было бы избежать этого промежуточного массива каким-то умным способом, например, использовать комбинацию pack/unpack?
Отредактировано: пример кода
код, который я пытаюсь оптимизировать выглядит следующим образом:
while (read(READ, $buf, $rec_l) == $rec_l) {
my @s = unpack "A24 C44 H8", $buf;
my $msisdn = substr $s[0], 0, 11;
my $address = join("", @s[4..14]);
my $imsi = join("", @s[25..39]);
my $ts = localtime(hex($s[45]));
}
Добавил больше кода на вопрос. – MariusM