2011-04-08 98 views
2

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

+1

這是*不*同樣的問題。散列比數組包含更多的凍結*邏輯*。如果你將它「倒入」到一個接收散列中,它可能(我不知道那些膽子是那麼好)必須在另一端重新整理所有東西(儘管它可以用於記憶效率 - )。所以關於最好的事情,我可以說它是算法上簡單的返回一個引用組裝散列比傳遞它作爲一個列表。 (「重複」引用*數組*。) – Axeman 2011-04-08 16:30:34

回答

1

如果您返回%HoA,您會按其值返回散列值,因此它將被複制並佔用額外的內存。如果你通過引用返回它,它不會被複制,所以它在性能和內存方面更好。

順便說一句,我想如果你返回%HoA,那麼它將被垃圾回收器銷燬,因爲它不會有任何引用。

+0

誰沒有給出評論而低估它爲什麼?這並不是那麼全面,但並不嚴格不正確。 – 2011-04-08 13:12:01

1

將散列提供爲純散列時,需要複製所有元素。對於非常大的哈希值,這可能是一個性能問題。提供散列參考時,僅複製引用。這通常更快。

另外你可能會發現靈感,以改善這個代碼:

#!/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; 
+0

順便說一句,如果你做了所有這些在哈希中有一個布爾值('1' /'0'表示真/假):任何其他值不是'0','undef'或'「」'將評估爲真正。因此,實際上可能沒有必要獲得所有值爲1的散列。 – 2011-04-08 12:59:13

+1

您的兩行代碼可以縮寫爲'my%new = map {$ _ => 1}鍵%$ ref;'。 – cHao 2011-04-09 13:31:41

相關問題