Benchmark: timing 1000 iterations of filereadbackwards, tailz, tailz1...
filereadbackwards: 1612.90/s (n=1000)
tailz: 152.91/s (n=1000)
tailz1: 12500.00/s (n=1000)
####
#!/usr/bin/perl
use Benchmark;
use File::ReadBackwards;
use strict;
#open (BLACKHOLE,">/dev/null") or die $!;
my $numlines =10;
my $filename = 'ARCHIVES';
timethese(1000, {
####################################################
filereadbackwards => sub {
my @lines;
my $line;
my $count=0;
my $bw = File::ReadBackwards->new($filename) or
die "can't read filename $!" ;
while(defined($line = $bw->readline)){
push @lines,$line ;
last if ++$count >= $numlines;
}
@lines= reverse @lines;
# print BLACKHOLE "@lines\n";
},
#####################################################
tailz => sub {
my $byte;
open FILE, "<$filename" or die "Couldn't open filename: $!";
seek FILE,-1, 2; #get past last eol
my $count=0;
while (1){
seek FILE,-1,1;
read FILE,$byte,1;
if(ord($byte) == 10 ){$count++;if($count == 10){last}}
seek FILE,-1,1;
if (tell FILE == 0){last}
}
$/=undef;
my $tail = ;
# print BLACKHOLE "$tail\n";
},
#########################################################
tailz1 => sub {
my $chunk = 400 * $numlines; #assume a <= 400 char line(generous)
# Open the file in read mode
open FILE, "<$filename" or die "Couldn't open $filename: $!";
my $filesize = -s FILE;
if($chunk >= $filesize){$chunk = $filesize}
seek FILE,-$chunk,2; #get last chunk of bytes
my @tail = ;
if($numlines >= $#tail +1){$numlines = $#tail +1}
splice @tail, 0, @tail - $numlines;
# print BLACKHOLE "@tail\n";
},
});
##
##
#!/usr/bin/perl -w
# example for files with max line lengths < 400, but it's adjustable
# usage tailz filename numberoflines
use strict;
die "Usage: $0 file numlines\n" unless @ARGV == 2;
my ($filename, $numlines) = @ARGV;
my $chunk = 400 * $numlines; #assume a <= 400 char line(generous)
# Open the file in read mode
open FILE, "<$filename" or die "Couldn't open $filename: $!";
my $filesize = -s FILE;
if($chunk >= $filesize){$chunk = $filesize}
seek FILE,-$chunk,2; #get last chunk of bytes
my @tail = ;
if($numlines >= $#tail +1){$numlines = $#tail +1}
splice @tail, 0, @tail - $numlines;
print "@tail\n";
exit;