2013-04-03 58 views
0

我有一個數組散列。哪種方式是循環最有效和最快速的方式。更有效地循環散列數組

my %h1 = (
    C1 => ['3','1','2'], 
    C2 => ['6','2','4'], 
    C3 => ['8', '1'], 
); 

OPTION 1

foreach my $key (keys %HoA) { 
    print "Articles in group $key are: "; 
    foreach (@{$HoA{$key}}) { 
    print "$_\n"; 
    } 
} 

OPTION 2

while(my ($k, $v) = each %HoA) { 
    print "Articles in group $k are: @$v\n"; 
} 

哪一個會救我的時間,如果我將通過一個巨大的家鄉地址循環。

+3

你的基準測試告訴你什麼? – SecurityMatt

+0

目前我有一個子程序,我使用嵌套的for-loop(選項1)循環使用一個大的HoA。使用嵌套的for-loops,子程序需要約。運行5-12秒。我還沒有嘗試使用while循環來循環HoA。 – cooldood3490

+0

這兩個不相同。選項2不會打印數組的內容。 – Borodin

回答

2

這是我的理解是keys將預先構建所有的哈希鍵的完整列表,這可以導致內存大量被用於一個大的哈希。我認爲這是一個考慮因素,因爲你說你有一個巨大的HoA。

對我來說,一些主要的區別是,有時候你想要一個按值或數組元素數排序的列表,我不認爲你可以控制each返回的鍵值對的順序。所以,在需要排序列表的情況下,我會使用keys。如果你的散列非常非常大,你需要鍵和值,但是順序並不重要,我會使用each,因爲它只返回兩個元素(鍵值對)的列表。另一個要考慮的問題是使用數據庫,正如其他人所建議的那樣,但這可能會以取決於數據大小爲代價。

我認爲很難回答「keys快於each?」的問題。而不知道更多關於數據的信息(並直接測試),但我認爲回答「在這種情況下我應該使用keys還是each?」這個問題可能更容易?根據您的目標以及「巨大HoA」的含義,我認爲有可能一種方法可能更高效並且性能更好,至少在內存方面。其他人可能在這個問題上有不同的意見和經驗,所以我會很感激任何反饋。

1

使用each可能會更清晰,也許速度更快,但是您不會獲得任何顯着的效果。

while (my ($key, $val) = each %HoA) { 
    print "Articles in group $key are: "; 
    foreach (@$val) { 
     print "$_\n"; 
    } 
} 
+0

你可以看看我之前問的這個問題嗎?比較哈希的那個。謝謝 – cooldood3490