我有一个用Perl编写的解析器,用于解析固定长度记录的文件。记录的一部分由几个字符串(也是固定长度)组成,仅由数字组成。字符串中的每个字符都是作为数字而不是ASCII字符编码的。例如,如果我有字符串12345,则编码为01 02 03 04 05(而不是31 32 33 34 35)。
我使用unpack解析记录,并将该特定部分解包为
我想知道这是否是解码的最佳方式。文件很大,有数百万条记录,显然我试图看看是否可能进行优化。分析器显示大部分时间都花在解析记录上(即读取、写入和其他操作不是问题),而在解析过程中,大部分时间都花在了这些join操作上。我记得从其他来源得知join是相当高效的操作。是否有任何想法可以进一步加快代码速度,或者已经是最优的了?也许可以以某种聪明的方式避免这个中间数组,例如使用pack/unpack组合?
编辑:代码示例
我尝试优化的代码如下:
我使用unpack解析记录,并将该特定部分解包为
@array = unpack "C44", $s
。然后,我使用简单的join恢复所需的字符串,例如$m = join("", @array)
。我想知道这是否是解码的最佳方式。文件很大,有数百万条记录,显然我试图看看是否可能进行优化。分析器显示大部分时间都花在解析记录上(即读取、写入和其他操作不是问题),而在解析过程中,大部分时间都花在了这些join操作上。我记得从其他来源得知join是相当高效的操作。是否有任何想法可以进一步加快代码速度,或者已经是最优的了?也许可以以某种聪明的方式避免这个中间数组,例如使用pack/unpack组合?
编辑:代码示例
我尝试优化的代码如下:
while (read(READ, $buf, $rec_l) == $rec_l) {
my @s = unpack "A24 C44 H8", $buf;
my $msisdn = substr $s[0], 0, 11;
my $address = join("", @s[4..14]);
my $imsi = join("", @s[25..39]);
my $ts = localtime(hex($s[45]));
}