在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选项)?
答案 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
文件,如果其他程序正在尝试访问此文件,则可能是因此而放慢了速度。