当前位置 : 主页 > 网络安全 > 测试自动化 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有一个用Perl编写的解析器,它解析固定长度记录的文件.记录的一部分由几个字符串(也是固定长度)组成,仅由数字组成.字符串中的每个字符都编码为数字,而不是ASCII字符.即,如果我有字
我有一个用Perl编写的解析器,它解析固定长度记录的文件.记录的一部分由几个字符串(也是固定长度)组成,仅由数字组成.字符串中的每个字符都编码为数字,而不是ASCII字符.即,如果我有字符串12345,则编码为01 02 03 04 05(而不是31 32 33 34 35).

我用unpack解析记录,这个特殊部分解压缩为@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]));
    }
未经测试(当我不那么忙的时候我会回来编辑)但是如果我已经正确地完成了所有的数学运算并且速度更快,这应该可行:

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);
网友评论