小编Mar*_*lis的帖子

List :: MoreUtils的each_array()和each_arrayref()中的内存泄漏?

我刚刚使用List :: MoreUtils中的each_array()和each_arrayref()发现了一个讨厌的内存泄漏.

这三行代码是每次运行执行四千次子程序的一部分.我的目标是为散列中已有的值提供适当的格式.我有一个固定数量的散列键和每个散列键的格式字符串.

my %hash = ();
# ...
my $two_arrays = each_arrayref( $field_list, $field_list_format );
while ( my ( $field, $format ) = $two_arrays->() ) {
    $hash{ $field } = sprintf $format, $hash{ $field };
}
Run Code Online (Sandbox Code Playgroud)

如果我return;之前坚持my $two_arrays ...,泄漏消失.同return;过去的最后一行,使泄漏.

由于子程序是守护程序的一部分,我注意到内存的持续增长(包括VIRT和RES).

我做错了什么?是否存在each_array()或each_arrayref()的任何内存泄漏,我不知道?

  • List :: MoreUtil(VERSION 0.22)
  • Linux 2.6.32-32-generic上的Perl 5.12.1(带线程的x86_64)(Ubuntu 10.04)

perl

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

Perl中字符串的最快校验位例程是什么?

给定一串数字,我必须使用Perl尽可能快地对所有数字求和.

我的第一个实现用unpack()解包数字,然后用List :: Utils的sum()对数字列表求和.它的速度非常快,但是这个任务有更快的打包/解包配方吗?

我试着使用pack/unpack组合,并对这两个实现进行了基准测试.二手CPU时间几乎相同; 也许有一些我不知道的快速技巧?

以下是我的基准测试方法:

#!/usr/bin/env perl

use 5.012;
use strict;
use List::Util qw/sum/;
use Benchmark qw/timethese/;

timethese ( 1000000, {
    list_util => sub {
        my $CheckDigit = "999989989";
        do {
            $CheckDigit = sum( unpack( 'AAAAAAAAA', $CheckDigit ) );
        } while ( $CheckDigit > 9 );
    },
    perl_only => sub {
        my $CheckDigit = "999989989";
        do {
            $CheckDigit = unpack( '%16S*', pack( 'S9', unpack( 'AAAAAAAAA', $CheckDigit ) ) );
        } while ( $CheckDigit > 9 );
    },
} …
Run Code Online (Sandbox Code Playgroud)

perl unpack pack

3
推荐指数
1
解决办法
399
查看次数

标签 统计

perl ×2

pack ×1

unpack ×1