Performance 更有效地通过数组的散列循环

Performance 更有效地通过数组的散列循环,performance,perl,optimization,hash,memory-efficient,Performance,Perl,Optimization,Hash,Memory Efficient,我有一个数组散列。这是最有效和最快的循环方式 my %h1 = ( C1 => ['3','1','2'], C2 => ['6','2','4'], C3 => ['8', '1'], ); 选项1 foreach my $key ( keys %HoA ) { print "Articles in group $key are: "; foreach ( @{$HoA{$key}} ) { print "$_\n"; }

我有一个数组散列。这是最有效和最快的循环方式

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

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

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

如果我在一个巨大的HoA中循环,哪一个能节省我的时间呢?

使用
每一个
可能会更清晰,可能会更快一些,但不管你怎么做,你都不会得到任何有意义的东西

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

使用
每一个
可能会更清晰,速度可能会稍微快一点,但不管你怎么做,你都不会得到任何有意义的东西

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

据我所知,
将预先构建所有哈希键的完整列表,这可能导致大量内存用于大型哈希。我认为这是考虑的一点,因为你说你有一个巨大的HoA

对我来说,一些主要的区别在于,有时您需要一个按值或数组元素数排序的列表,我认为您无法控制
每个
返回的键值对的顺序。因此,在需要排序列表的情况下,我将使用
。如果您的散列非常非常大,并且您需要键和值,但顺序并不重要,我会使用
每个
,因为它只返回两个元素(您的键值对)的列表。另一个要考虑的是使用数据库,正如其他人所建议的那样,但这可能要根据数据的大小而定。


我认为在不了解更多数据(并直接测试数据)的情况下,很难回答“按键是否比每个按键都快?”这个问题,但我认为回答“在这种情况下我应该使用按键还是每个按键?”这个问题可能更容易,这取决于你的目标和“巨大的HoA”的含义,我认为有一种方法可能更有效,并产生更好的性能,至少在内存方面是如此。其他人对此可能有不同的意见和经验,因此我希望得到任何反馈。

我的理解是,
键将预先构建所有哈希键的完整列表,这可能会导致大量内存用于大型哈希。我认为这是考虑的一点,因为你说你有一个巨大的HoA

对我来说,一些主要的区别在于,有时您需要一个按值或数组元素数排序的列表,我认为您无法控制
每个
返回的键值对的顺序。因此,在需要排序列表的情况下,我将使用
。如果您的散列非常非常大,并且您需要键和值,但顺序并不重要,我会使用
每个
,因为它只返回两个元素(您的键值对)的列表。另一个要考虑的是使用数据库,正如其他人所建议的那样,但这可能要根据数据的大小而定。


我认为在不了解更多数据(并直接测试数据)的情况下,很难回答“按键是否比每个按键都快?”这个问题,但我认为回答“在这种情况下我应该使用按键还是每个按键?”这个问题可能更容易,这取决于你的目标和“巨大的HoA”的含义,我认为有一种方法可能更有效,并产生更好的性能,至少在内存方面是如此。其他人可能对此问题有不同的意见和经验,因此我希望得到反馈。

您的基准测试告诉您什么?目前我有一个子程序,使用嵌套for looped(选项1)在大型HoA中循环。使用嵌套for循环,子例程运行大约需要5-12秒。我还没有尝试过使用while循环遍历HoA。这两个循环并不等价。选项2不会打印数组的内容。@Borodin修复了它,我意识到我需要使用数组中的每个元素作为一个键,所以我可能仍然需要使用嵌套循环。听起来你应该使用一个数据库。你的基准告诉你什么?目前我有一个子程序,我在一个大型HoA中使用嵌套循环(选项1)。使用嵌套for循环,子例程运行大约需要5-12秒。我还没有尝试过使用while循环遍历HoA。这两个循环并不等价。选项2不会打印数组的内容。@Borodin修复了它,但是,我意识到我需要使用数组的每个元素作为键,所以我可能仍然需要使用嵌套循环。听起来你应该使用数据库。你能看看我在这之前问的问题吗?关于比较散列的那个。谢谢你能看看我在这之前问的问题吗?关于比较散列的那个。谢谢