可能重复:
Is returning a whole array from a Perl subroutine inefficient?
我有这段代码
my $h = function($ref);
sub function {
my $ref = shift @_;
my %HoA = ();
foreach my $key (keys %$ref) {
$HoA{$key} = 1;
}
return \%HoA;
}
返回对%HoA
的引用。
就性能和内存使用而言,最好是返回引用还是应该return %HoA
?
答案 0 :(得分:1)
如果返回%HoA,则返回哈希值,因此会复制哈希并占用额外的内存。如果你通过引用返回它,它将不会被复制,因此它在性能和内存方面更好。
顺便说一句,我想如果你返回%HoA那么它将被垃圾收集器销毁,因为它没有任何引用。答案 1 :(得分:1)
当提供散列为普通散列时,需要复制所有元素。对于非常大的哈希,这可能是性能问题。提供hashref时,仅复制引用。这通常更快。
此外,您可能会从中获得改进代码的灵感:
#!/usr/bin/perl
my $ref = {
foo => 23,
bar => 42,
};
# do it with function
sub hash_to_1 {
my $hash = shift;
my %result;
# list assignment like: (all hash elements) = ('1' as often as number of keys)
@result{keys %$hash} = (1) x keys %$hash;
return \%result;
}
# do it one line
my %new;
map { $new{$_} = 1} keys %$ref;