【问题标题】:Pre-declaring a perl 2-D array reference预先声明一个 perl 二维数组引用
【发布时间】:2014-07-10 11:25:19
【问题描述】:

我有一个 Perl 程序,它最终会填充 5000 x 26 二维数组 ref 中的每个索引。

所以考虑一下:

my $aLarge2dArray;
for (my $i = 0; $i < 5000; $i++) {
    for (my $j = 0; $j < 26; $j++) {
        $aLarge2dArray->[$i][$j] = 'TRUE';
    };
};

我在一台拥有大量内存的计算机上运行它,所以我不担心节省内存,但我热衷于速度。

我的直觉是,我会受益于预先声明 $aLarge2dArray 以使事情变得更快,我这样做如下:

my $aLarge2dArray;
$aLarge2dArray->[4999][25] = 0;

我的问题:

1) 这是在初始化时预先声明(和实例化)二维数组引用的正确/最佳方式吗?

2) 这会让事情变得更快吗(记住内存不是问题,我有足够的)?

感谢任何答案/指点。

【问题讨论】:

  • 如果您想将其初始化为 false,您可能根本不需要初始化它,这要归功于自动激活。例如$aLarge2dArray-&gt;[$i][$j] 在功能上等同于 (($aLarge2dArray //= [] )-&gt;[$i] //= [])-&gt;[$j]
  • 你预初始化的优势也可能没有你想象的那么大。

标签: arrays perl memory reference declaration


【解决方案1】:

不,您只会将最后一个数组中的最后一个单元格设置为零,

my $aLarge2dArray;
$aLarge2dArray->[10][5] = 0;

use Data::Dumper; print Dumper $aLarge2dArray;

输出

$VAR1 = [
      undef,
      undef,
      undef,
      undef,
      undef,
      undef,
      undef,
      undef,
      undef,
      undef,
      [
        undef,
        undef,
        undef,
        undef,
        undef,
        0
      ]
    ];

你可能想试试这个,

@$aLarge2dArray = map [ (0) x26 ], 0..4999;

【讨论】:

  • 同意,我只会设置“最后一个”条目,但我认为,也许不正确的是,为了这样做,Perl 会分配完整的二维数组 ref 所需的内存。换句话说:1)我是否必须填充二维数组 ref 中的每个单元格以“预分配”内存,以及 2)这会使事情变得更快吗?
  • 每次访问除最后一行以外的行时,perl 都需要动态调整它的大小,因为它首先不是 arrayref,然后可能太短了 arrayref,这不是他想要的。
  • 感谢你们的cmets;我感觉一个共识是你必须用一个虚拟值填充所有单元格以完全分配所需的内存。问题的下一个(也许是更关键的)元素是它会让事情变得更快吗?
  • @user3590005,我不明白为什么越早做会更快。充其量,它可能会增加变量在内存中彼此更接近的几率。如果您确实进行了预分配(使用$#a 或首先分配给最后一个元素),您将节省一些分配,但这将是一个相当小的好处。
猜你喜欢
  • 2014-03-03
  • 1970-01-01
  • 2022-01-15
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多