【问题标题】:Should I return a reference or the hash? [duplicate]我应该返回引用还是哈希? [复制]
【发布时间】:2011-08-01 11:58:07
【问题描述】:

可能重复:
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

【问题讨论】:

  • 不是同一个问题。哈希比数组包含更多冻结的逻辑。如果您将其“倒入”接收散列中,它可能(我不太了解胆量)必须在另一端重新散列整个内容(尽管为了提高效率,它可以到内存副本中——perlers 很聪明) )。所以关于最好的事情,我可以说返回对组装散列的引用比将其作为列表传递在算法上更简单。 (“重复”引用 arrays。)

标签: perl hash reference


【解决方案1】:

如果您返回 %HoA,您将按其值返回哈希,因此它将被复制并占用额外的内存。如果您通过引用返回它,它不会被复制,因此在性能和内存方面会更好。

顺便说一句,我认为如果你返回 %HoA 那么它将被垃圾收集器销毁,因为它上面不会有任何引用。

【讨论】:

  • 谁在不发表评论的情况下对此投反对票,为什么?它不是那么全面,但并非完全不正确。
【解决方案2】:

当提供哈希作为普通哈希时,所有元素都需要被复制。对于非常大的哈希,这可能是一个性能问题。提供 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;

【讨论】:

  • 顺便说一句,如果你这样做是为了在哈希中有一个布尔值(1/0 表示真/假):任何其他不是0undef"" 将评估为真。因此,实际上可能没有必要获取所有值为 1 的哈希。
  • 你的两行一行可以缩短为my %new = map {$_ => 1} keys %$ref;
猜你喜欢
  • 2016-10-04
  • 2013-01-03
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2011-02-25
  • 2012-03-21
  • 2014-08-31
  • 1970-01-01
相关资源
最近更新 更多