2013-04-03 30 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