追記:間違えてた。ほんとだー。そう言われれば当たり前ですねすみません。sysreadのほうが速いのは当然です!
use strict;
use Benchmark qw(cmpthese);
cmpthese -1, {
sysread => sub {
my $buf;
open my $fh, '<', __FILE__;
sysread $fh, $buf, -s __FILE__;
},
slurp_local => sub {
local $/;
open my $fh, '<', __FILE__;
my $buf = <$fh>;
}
};
なんかtwitter見てたらこういうのを貼ってる人がいたので、一応書いておく。
Perlでファイルを一気に読み込むのは local $/; <$fh> が一番速い。
open my $fh, '<', "/path/to/file.txt"
or die "failed to open file: $!";
my $content = do { local $/; <$fh> };
いずれにせよ大きいファイルを処理する場合はこういう風に一気に読み込むのは効率悪い。それを分かった上で、それでも1行ずつ改行コードが取り除かれた状態で配列に読み込みたいならこれをsplitするのが一番速い。
open my $fh, '<', "/path/to/file.txt"
or die "failed to open file: $!";
my @lines = split /\n/, do { local $/; <$fh> };
単純に一行ずつ処理する、という話だったら一括読み込みとかは忘れて、一行ずつ処理がベター。
open my $fh, '<', "/path/to/file.txt"
or die "failed to open file: $!";
while (my $ln = <$fh>) {
....
}
コメント