use strict; use Benchmark qw(cmpthese); use lib '/home/mason/devel/lib'; use IO::All; use File::ReadBackwards; my $f = "/usr/local/apache/logs/error_log"; cmpthese( -3, { 'OP\'s' => sub { my $lineno = 100; open( FILE, "$f" ) or die "Can't find $f\n"; my @lines = ; my $num = @lines; my @last; for ( ; $lineno > 0 ; $lineno-- ) { push(@last,$lines[ $num - $lineno ]); } close(FILE); }, 'IO::All->backwards' => sub { my $f = io($f)->backwards; my @lines = reverse map { $f->getline } 1 .. 100; }, 'File::ReadBackwards' => sub { my $f = File::ReadBackwards->new($f); my @lines = reverse map { $f->readline } 1 .. 100; }, 'TedYoung' => sub { my @lines; my $lines = 100; open F, $f or die $!; my @lines; while () { push @lines, $_; shift @lines if @lines > $lines; } close F; }, '`tail -100`' => sub { my @lines = `tail -100 $f`; }, 'RandomWalk' => sub { my ($file, $lines) = ($f,100); open F, $file or die $!; my @lines; $#lines=($lines-1); my $i; while () { $lines[$i++] = $_; $i = 0 if $i == $lines; } close F; return @lines[$i--..$#lines, 0..$i] } } );