Modifying jeroenes's modification of davorg's modified
benchmark (threw in tye's neat trick for good measure):
Rate join argv hybrid linesep sysread
join 5459/s -- -44% -71% -81% -91%
argv 9690/s 78% -- -49% -67% -85%
hybrid 19084/s 250% 97% -- -34% -70%
linesep 29070/s 433% 200% 52% -- -55%
sysread 64103/s 1074% 562% 236% 121% --
Nice, dkubb! I think we have a winner. Not only is
_sysread() clearly the fastest, but it burns
the least CPU*. I like it! Hopefully there are no
"catches."
update: _argv() is
almost as fast as _linesep() when working
with large files. _join() and
_hybrid() tend to fall behind.
* Linux 2.4, Celeron-366, Perl 5.6.0
#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese);
my $file = $0;
open(IN, $file) or die "$file: $!\n";
cmpthese(50_000, {
join => \&_join,
linesep => \&_linesep,
hybrid => \&_hybrid,
sysread => \&_sysread,
argv => \&_argv
});
close(IN);
sub _join {
seek(IN, 0, 0); my $content = join '', <IN>;
}
sub _linesep {
seek(IN, 0, 0); my $content = do { local $/; <IN> }
}
sub _hybrid {
seek(IN, 0, 0); my $content = do { local $/; join '', <IN> }
}
sub _sysread {
seek(IN, 0, 0); sysread IN, my $content, -s IN
}
sub _argv {
my $content =
do { local(*ARGV, $/); @ARGV = ($file); <> }
}
|