ファイルからデータベースにデータをロードする成熟したコード本体があります。いくつかのファイル形式があります。これらはすべて固定幅フィールドです。
コードの一部では、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