我可以通过拆分有条件地插入哈希时避免字符串复制吗?

时间:2012-06-13 19:24:09

标签: perl performance

我正在%grouped建立%uniq_c,其中%grouped包含通过拆分%uniq_c的关键IF %uniq_c生成的键/值对价值足够高。它效率很高,但我想做得更好。

%uniq_c = (
    'foo:baz'   => 3,
    'foo:quux'  => 12,
    'bar:corge' => 15,
    'bar:fred'  => 8,
);

foreach my $gv (keys %uniq_c) {
        if( $uniq_c{$gv} >= 10 ) {
                my ($g, $v) = split /:/, $gv, 2;
                push( @{$grouped{$g}}, $v );
        }
}

认为每次循环迭代都会发生三个字符串副本; 1美元为$ g,2美元为$ v。有没有办法消除$ v副本中的一个,或者更好的是,$ v和$ g副本(可能是某种字符串切片)?

作为参考,Data :: Dump :: dump(%groups)产生以下内容:

(
  "bar", ["corge"],
  "foo", ["quux"],
)

1 个答案:

答案 0 :(得分:4)

复制split返回的值非常有效;字符串缓冲区被盗而不是被复制。但推送$v时还有另一个副本。通过别名可以避免所有这三个副本。

use Data::Alias qw( alias );

foreach my $gv (keys %uniq_c) {
        if( $uniq_c{$gv} >= 10 ) {
                alias my ($g, $v) = split /:/, $gv, 2;
                alias push @{$grouped{$g}}, $v;
        }
}