#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);
use FileHandle;
cmpthese(100000, {
fh_1 => sub {
open my $fh1, "<", "a.txt" or die $!;
my @whole_file = <$fh1>;
},
fh_2 => sub {
open my $fh2, "<", "a.txt" or die $!;
my @whole_file = $fh2->getlines;
},
fh_3 => sub {
my $fh3 = FileHandle->new;
$fh3->open("< a.txt") or die $!;
my @whole_file = $fh3->getlines;
}
});
__END__
Rate fh_3 fh_2 fh_1
fh_3 29155/s -- -36% -43%
fh_2 45872/s 57% -- -11%
fh_1 51282/s 76% 12% --
Во-первых, для того чтобы использовать объектные методы для файлового дескриптора (варианты fh_2, fh_3), необязательно прибегать к помощи модуля FileHandle, в чьей компетенции находится предоставление подобного функционала. Можно обойтись и без него, если прочитать пару строк из документации perlobj:
Under the hood, Perl filehandles are instances of the "IO::Handle" or "IO::File" class. Once you have an open filehandle, you can call methods on it. Additionally, you can call methods on the "STDIN", "STDOUT", and "STDERR" filehandles.
open my $fh, '>', 'path/to/file';
$fh->autoflush();
$fh->print('content');
STDOUT->autoflush();
Т.е. как мы видим, под "капотом", файловые дескрипторы - это нечто иное, как экземпляры классов IO::Handle или IO::File.
Во-вторых, при Benchmark тестировании трёх вариантов реализации для чтения файла целиком (обычно так не делают конечно же), можно увидеть, что первенство остаётся за старым добрым "угловатым" способом для чтения файловых дескрипторов <$fh>.
Ну и в-третьих, вы уже, наверное, заметили, что в тестах не используется close для закрытия файловых дескрипторов, так как это выполняется автоматически самим Perl (perlopentut):
Another convenient behavior is that an indirect filehandle automatically closes when there are no more references to it:
sub firstline {
open( my $in, shift ) && return scalar <$in>;
# no close() required
}
Комментариев нет:
Отправить комментарий