我正在编写一个生成多个大型数组散列(HoA)数据结构的脚本。我正在尝试优化我的脚本,因为目前它需要花费大量时间来运行。
我做了一些基准测试。我设法使脚本执行大约。@_
通过使用数组引用并通过直接使用而不是将其复制到变量中来减少子例程调用开销,速度提高了 3.5 倍。我还删除了不必要的子程序和多余的变量声明。尽管有这些改进,我还是想让代码运行得更快。
在我的脚本开始时,我解析一个大文件以生成两个 HoA 数据结构。这些关于哈希引用的方法中哪一种是最可行和最有效的?HoA 看起来像这样:
%HoA = (
'C1' => ['1', '3', '3', '3'],
'C2' => ['3','2'],
'C3' => ['1','3','3','4','5','5'],
'C4' => ['3','3','4'],
'C5' => ['1'],
);
选项1
在我解析文件时生成 HoA(见下文)。最后将数组的哈希值放入哈希引用中。
my $hash_ref = \%HoA;
选项 2
解析文件,使 HoA 中的每个键都有一个指向 array_ref 的值。最后将数组的哈希值放入哈希引用中。
===============
我觉得选项 2 是一个很好的方法,但我该怎么做呢?
这是我目前的做法。
use strict; use warnings;
open(F1, "file.txt") or die $!;
my %HoA = ();
while (<F1>){
$_=~ s/\r//;
chomp;
my @cols = split(/\t/, $_);
push( @{$HoA{$cols[0]}}, @cols[1..$#cols]);
}
close F1;
我需要一个高效的数据结构来帮助我快速查找值和键。此外,我需要能够尽可能高效地将键值(数组)、键和 HoA 本身多次传递到子例程中。