【问题标题】:how to improve Performance for this code?如何提高此代码的性能?
【发布时间】:2014-08-06 14:50:24
【问题描述】:

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

【问题讨论】:

  • 没用过!你能告诉我怎么做吗?
  • 你认为 $input_io 和 $output_io 可以放入内存吗?也许你在 I/O 上浪费时间
  • 磁盘 I/O 将成为您的瓶颈,因此只要您正在读取和写入所有 200M 行,我看不出有任何方法可以显着加快速度。你到底想达到什么目的? (不是如何,而是 what)也许有更好的方法,不需要那么多 I/O。
  • $input_io 和 $output_io 只是指针.. 内存使用不是我的问题..
  • 0和1的列表从何而来?

标签: performance perl file-io runtime


【解决方案1】:

在这里,正则表达式解决方案可能有点矫枉过正。将if/else 块替换为:

substr($line, 0, 3, $bin_list[$i] ? 'XXX' : 'YYY';

【讨论】:

  • 快了 10%.. 好的开始.. 现在我想知道是否可以加快写作速度
  • @user3787639 编辑您的问题以包含 tjd 的代码会使此答案完全无效。想象一下,如果我问:“我有工作。我怎样才能赚更多的钱?”有人回答说:“找份工作。”答案没有意义。请不要进行这样的修改。
【解决方案2】:

最小的变化可能是 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 秒)。

【讨论】:

  • 我正在将行缓冲到列表中。是的,我正在使用 IO::ALL。我现在正在运行我的测试用例,看看你回答的最后一部分是否。
猜你喜欢
  • 2016-04-12
  • 2016-11-27
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多