如何提高此代码的性能?

时间:2014-08-06 14:50:24

标签: performance perl file-io runtime

此代码至少在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++;
    }

2 个答案:

答案 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)。