我们有一套成熟的代码,可以将文件中的数据加载到数据库中。有几种文件格式;它们都是固定宽度的字段。
部分代码使用 Perlunpack()
函数将输入数据中的字段读取到包变量中。然后,业务逻辑能够以“人类可读”的方式引用这些字段。
文件读取代码在读取文件之前由格式描述生成一次。
在草图形式中,生成的代码如下所示:
while ( <> ) {
# Start of generated code.
# Here we unpack 2 fields, real code does around 200.
( $FIELDS::transaction_date, $FIELDS::customer_id ) = unpack q{A8 A20};
# Some fields have leading space removed
# Generated code has one line like this per affected field.
$FIELDS::customer_id =~ s/^\s+//;
# End of generated code.
# Then we apply business logic to the data ...
if ( $FIELDS::transaction_date eq $today ) {
push @fields, q{something or other};
}
# Write to standard format for bulk load to the database.
print $fh join( '|', @fields ) . q{\n} or die;
}
分析代码显示,大约 35% 的时间花在解包和前导空格条上。剩余时间用于验证和转换数据以及写入输出文件。
似乎没有任何一个业务逻辑部分占用超过 1-2% 的运行时间。
问题是——我们能否以某种方式从拆包和空间剥离中获得更快的速度?最好不必重构所有引用 FIELDS 包变量的代码。
编辑:
万一它有所作为
$ perl -v
This is perl, v5.8.0 built for PA-RISC1.1