Perl 在通过split有条件地插入散列时,是否可以避免字符串复制?
我正在从Perl 在通过split有条件地插入散列时,是否可以避免字符串复制?,perl,performance,Perl,Performance,我正在从%uniq\u c构建%grouped,其中%grouped包含通过拆分%uniq\u c的键(如果%uniq\u c的值足够高)生成的键/值对。这相当有效,但我想做得更好 %uniq_c = ( 'foo:baz' => 3, 'foo:quux' => 12, 'bar:corge' => 15, 'bar:fred' => 8, ); foreach my $gv (keys %uniq_c) { i
%uniq\u c
构建%grouped
,其中%grouped
包含通过拆分%uniq\u c
的键(如果%uniq\u 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(%grouped)生成以下内容:
(
"bar", ["corge"],
"foo", ["quux"],
)
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;
}
}
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;
}
}
是什么让你相信有字符串复制发生?是什么让你相信有字符串复制发生?“字符串缓冲区被盗”:就是说l值是通过拆分直接写入的,从而避免复制出临时变量?不是,这意味着赋值将指针移动到字符串缓冲区,而不是复制字符串缓冲区本身。因此,它适用于返回temp的每个子函数和函数,而不仅仅是
split
“字符串缓冲区被盗”:这是否意味着l值通过split直接写入,从而避免复制出临时变量?不,这意味着赋值将指针移动到字符串缓冲区,而不是复制字符串缓冲区本身。因此,它适用于返回temp的每个子函数和函数,而不仅仅是split
。