#!/usr/bin/perl use strict; use warnings; use Benchmark qw(:all); use Data::Dumper; use File::Slurp; my $FName = shift // 'TESTDATA'; my $iterations = shift // 500; # Both for error checking *AND* warming up the disk cache my $expected = length(slurp_local($FName)); my %cnt; sub slurp_local { my $Name = shift; open my $FH, '<', $Name; local $/; my $str = <$FH>; return $str; } sub slurp_join { my $Name = shift; open my $FH, '<', $Name; my $str = join("",<$FH>); return $str; } sub slurp_for { my $Name = shift; open my $FH, '<', $Name; my $str = ''; $str .= $_ for <$FH>; return $str; } print "Reading file '$FName' $iterations times with each routine.\n"; cmpthese($iterations, { slurp_local => sub { $cnt{slurp_local}{length(slurp_local($FName))}++; }, slurp_join => sub { $cnt{slurp_join}{length(slurp_join($FName))}++; }, slurp_for => sub { $cnt{slurp_for}{length(slurp_for($FName))}++; }, slurp_FS => sub { $cnt{slurp_FS}{length(read_file($FName))}++; }, }); for my $k (keys %cnt) { for my $v (keys %{$cnt{$k}}) { my $msg = ''; $msg = 'ERROR! wrong length!' if $v != $expected; printf "% 8u %s %s\n", $v, $k, $msg; } }