#! perl -slw use strict; use Benchmark qw[ cmpthese ]; our $N ||= 1000; ## Gen some test data into ramfile to exclude io buffering from the benchmark our $testData; open our $fhTest, '>', \$testData; printf $fhTest '%05d%295s%4500s', $_, 'h' x 295, join( '', '000000000000000001' .. '000000000000000250' ) for 1 .. $N; close $fhTest; printf "Test data: %.f records\n", length( $testData ) /4800; open $fhTest, '<', \$testData; cmpthese -3, { lrefs => q[ my $buffer = chr(0) x 4800; ## Pre-partition the data using lvalue refs my $header = \substr $buffer, 0, 300; my @subs = map{ \substr( $buffer, 300 + $_ *18, 18 ) } 0 .. 249; seek $fhTest, 0, 0; while( read( $fhTest, $buffer, 4800, 0 ) == 4800 ) { # printf "H:%-20.20s first: %s last: %s\n", # $$header, ${ $subs[0] }, ${ $subs[249] }; # $hash{ $$header } = [ map{ $$_ } @subs ]; } ], substr => q[ my $buffer; my %hash; seek $fhTest, 0, 0; while( read( $fhTest, $buffer, 4800, 0 ) == 4800 ) { my $header = substr $buffer, 0, 300; my @subs; $subs[ $_ ] = substr $buffer, 300 + $_ *18, 18 for 0 .. 249; # printf "H:%-20.20s first: %s last: %s\n", # $header, @subs[ 0, 249 ]; # $hash{ $header } = \@subs; } ], unpack => q[ my $buffer; my %hash; seek $fhTest, 0, 0; while( read( $fhTest, $buffer, 4800, 0 ) == 4800 ) { my( $header, @subs ) = unpack 'a300(a18)250', $buffer; # printf "H:%-20.20s first: %s last: %s\n", # $header, @subs[ 0, 249 ]; # $hash{ $header } = \@subs; } ], };