小编Mar*_*usM的帖子

为什么Perl中的函数调用循环如此缓慢?

我在Perl中编写了一个文件解析器,因此不得不循环遍历文件.文件由固定长度的记录,我想作出这样的分析给定记录一个单独的函数,并调用该函数在一个循环.但是,对于大文件,最终结果变得缓慢,我的猜测是我不应该使用外部函数.所以我在循环中使用和不使用函数调用进行了一些虚拟测试:

[一个]

foreach (1 .. 10000000) {
$a = &get_string();
}

sub get_string {
return sprintf("%s\n", 'abc');
}
Run Code Online (Sandbox Code Playgroud)

[B]

foreach (1 .. 10000000) {
$a = sprintf "%s\n", 'abc';
}
Run Code Online (Sandbox Code Playgroud)

测量表明,代码运行比我事先知道代码中的本来运行速度变慢代码B.慢约3-4次,但我还是很惊讶,差别那么大.还试图用Python和Java运行类似的测试.在Python代码中的当量为除B慢约20%和Java代码被以相同的速度乳宁或多或少(如预期).将函数从sprintf更改为其他内容并未显示任何显着差异.

有没有办法帮助Perl更快地运行这样的循环?我在这里做了一些完全错误的事情,还是Perl的功能是函数调用是这样的开销?

perl performance

16
推荐指数
3
解决办法
4537
查看次数

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

我有一个用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)

perl performance join unpack

4
推荐指数
1
解决办法
333
查看次数

标签 统计

performance ×2

perl ×2

join ×1

unpack ×1