unpack 结合 Perl 中的 join 的性能

标签 performance perl join unpack

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

我用解包来解析记录,这个特定的部分被解包为 @array = unpack "C44", $s .然后我用简单的连接恢复需要的字符串,比如 $m = join("", @array) .

我想知道这是否是解码的最佳方式。文件很大,有数百万条记录,显然我试图查看是否可以优化。 Profiler 显示大部分时间都花在解析记录上(即读、写和其他东西都不是问题),而解析大部分时间都被这些连接占用了。我记得从其他来源说 join 是相当有效的操作。任何想法是否可以提高代码速度或者它是否已经是最佳的?也许有可能以某种巧妙的方式避免这个中间数组,例如,使用打包/解包组合?

编辑:代码示例

我尝试优化的代码如下所示:

    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);

关于unpack 结合 Perl 中的 join 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10429785/

相关文章:

MySQL 没有在带有 GROUP BY 查询的 SUM 中使用索引

performance - 如何测量 F# 代码的 CPU 和内存使用情况?

perl - 如何从 URL 获取查询字符串 - perl

linux - SUSE Linux Enterprise 中的 perl $filename 与 ./$filename

java - Hibernate - 从我的示例表中获取错误的实体。看起来表列是 "exchanged"

mysql - 具有多个连接的慢 MySQL 查询

php - 从表中选择逗号分隔的记录以及用户图像

MySQL 查询加速

javascript - 为什么 convertToFastObject 函数使其变快?

perl - 我应该如何处理不应再在 Perl 中使用的对象?