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); <> }
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.