读取和写入同一文件时的Perl性能

时间:2015-04-09 07:20:42

标签: perl file-io

在Linux上使用Perl读取/写入用户文件的这两种方式之间是否有明显的性能差异?

选项1:

open (READFILE, '<:utf8', "users/$_[0]") or die ("no read users/$_[0]");
    # Do the reading
close (READFILE) or die;
# Do more stuff
open (WRITEFILE, '>:utf8', "users/$_[0]") or die ("no write users/$_[0]"); flock (WRITEFILE, 2) or die ("no lock users/$_[0]");
    # Do the writing
close (WRITEFILE) or die;

选项2:

open (USERFILE, '+<:utf8', "users/$_[0]") or die ("no open users/$_[0]"); flock (USERFILE, 2) or die ("no lock users/$_[0]");
    # Do the reading
    # Do more stuff
    seek (USERFILE, 0, 0); truncate (USERFILE, 0);
    # Do the writing
close (USERFILE) or die ("no write users/$_[0]");

用户文件不大,通常为20-40行或2-4 KB。

是否还有其他理由选择选项1或2(或第3选项)?

1 个答案:

答案 0 :(得分:1)

这是一个可以用来测试它的基准测试,我怀疑获得一个新的文件描述符是一个需要更长时间的部分,如果你再次close然后open

#!/usr/bin/env perl

use warnings;
use strict;
use open qw(:encoding(utf8) :std);

use Benchmark qw<cmpthese>;
my $text = <<TEXT;
I had some longer text here, but for better readability, just
these two lines.
TEXT


cmpthese(10_000,{
     close => sub{
       open my $file, '<',"bla" or die "$!";
       my @array = <$file>;
       close $file or die;
       open $file, '>',"bla" or die "$!";
       $file->print($text)
     },
     truncate => sub {
       open my $file, '+<',"bla" or die "$!";
       my @array = <$file>;
       seek $file,0,0;
       truncate $file, 0;
       $file->print($text)
     },
     truncate_flock => sub {
       open my $file, '+<',"bla" or die "$!";
       flock $file, 2;
       my @array = <$file>;
       seek $file,0,0;
       truncate $file, 0;
       $file->print($text)
     },

});

我机器上的输出:

                 Rate          close truncate_flock       truncate
close          2703/s             --           -15%           -17%
truncate_flock 3175/s            17%             --            -3%
truncate       3257/s            21%             3%             --

更高的比率更好。使用close的速度要慢1.17倍。 但这在很大程度上取决于您more stuff需要多长时间,因为您在flock示例中{{}} truncate文件,如果其他程序正在尝试访问此文件,则可能是因此而放慢了速度。