unpack的性能与Perl中的join相结合

Mar*_*usM 4 perl performance join unpack

我有一个用Perl编写的解析器,它解析固定长度记录的文件.记录的一部分由几个字符串(也是固定长度)组成,仅由数字组成.字符串中的每个字符都编码为数字,而不是ASCII字符.即,如果我有字符串12345,则编码为01 02 03 04 05(而不是31 32 33 34 35).

我解压缩记录,并将此特定部分解压缩为@array = unpack "C44", $s.然后我用简单的连接恢复所需的字符串,比如$m = join("", @array).

我想知道这是否是解码的最佳方式.文件非常庞大,有数百万条记录,显然我试图查看是否可以进行优化.Profiler显示大部分时间都花在解析记录上(即读取,写入和其他内容不是问题),并且在解析大部分时间都是由这些连接进行的.我记得其他来源说加入是非常有效的操作.任何想法是否可以加快代码速度或是否已经最佳?也许有可能以某种巧妙的方式避免使用这个中间阵列,例如,使用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]));
    }
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 6

未经测试(当我不那么忙的时候我会回来编辑)但是如果我已经正确地完成了所有数学运算并且速度更快,那么这应该可行:

my ($msisdn, $address, $imsi, $ts) = 
    unpack "A11 x13 x3 a10 x10 a15 x5 N", $buf;
$address |= "0" x 10;
$imsi |= "0" x 15
$ts = localtime($ts);
Run Code Online (Sandbox Code Playgroud)