此代码至少在200M行的文件上运行。这需要很多时间 我想知道我是否可以改善这个循环的运行时间。
my @bin_lsit; #list of 0's and 1's
while (my $line = $input_io->getline) {
if ($bin_list[$i]) {
$line =~ s/^.{3}/XXX/;
} else {
$line =~ s/^.{3}/YYY/;
}
$output_io->appendln($line);
$i++;
}
答案 0 :(得分:1)
正则表达式解决方案在这里可能过度。如何用{:
替换if/else
块
substr($line, 0, 3, $bin_list[$i] ? 'XXX' : 'YYY';
答案 1 :(得分:0)
最小的变化可能是在appendln之间缓冲
my @bin_lsit; #list of 0's and 1's
my $i = 0;
while (my $line = $input_io->getline) {
if ($bin_list[$i]) {
$line =~ s/^.{3}/XXX/;
} else {
$line =~ s/^.{3}/YYY/;
}
$buffer .= $line;
if ( $i % 1000 == 0 ) {
$output_io->appendln($buffer);
$buffer = '';
}
$i++;
}
if ( $buffer ne '' ) {
$output_io->appendln($buffer);
}
你在使用IO :: All吗? 我无法用appendln找到任何其他东西......
取而代之:
my $input_io = io 'tmp.this';
my $output_io = io 'tmp.out';
while (my $line = $input_io->getline ) {
$output_io->appendln($line);
}
有了这个:
open(IFH, 'tmp.this');
open(OFH, '>>tmp.out');
while (my $line = <IFH> ) {
print OFH $line;
}
close IFH;
close OFH;
相当快一点(在我的测试用例中为1秒vs 23)。