Benchmark: running BufferedFileHandle, chunk, linebyline, each for at least 3 CP
U seconds...
BufferedFileHandle: 3 wallclock secs ( 3.22 usr + 0.08 sys = 3.30 CPU) @ 2.73/s (n=9)
chunk: 4 wallclock secs ( 2.89 usr + 0.32 sys = 3.21 CPU) @ 4.36/s (n=14)
linebyline: 4 wallclock secs ( 3.25 usr + 0.06 sys = 3.31 CPU) @ 2.72/s (n=9)
####
#!/usr/bin/perl
use Benchmark;
use strict;
use FileHandle;
timethese(0, { 'linebyline' => \&linebyline,
'chunk' => \&chunk ,
'BufferedFileHandle' => \&BufferedFileHandle });
sub linebyline {
open(FILE, "file");
while() { }
close(FILE);
}
sub chunk {
my($buf, $leftover, @lines);
open(FILE, "file");
while(read FILE, $buf, 64*1024) {
$buf = $leftover.$buf;
@lines = split(/\n/, $buf);
$leftover = ($buf !~ /\n$/) ? pop @lines : "";
foreach (@lines) { }
}
close(FILE);
}
sub BufferedFileHandle{
my $fh=new FileHandle;
my $buffer_var;
$fh->open("file");
$fh->setvbuf($buffer_var, _IOLBF, 64*1024);
while(<$fh>) { }
close(FILE);
}