C:\test>535539 Test data: 1000 records Rate unpack substr lrefs unpack 1.77/s -- -33% -99% substr 2.65/s 50% -- -99% lrefs 196/s 10974% 7289% -- #### 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; while( read( $fhTest, $buffer, 4800, 0 ) == 4800 ) { ... } #### C:\test>535539 Test data: 1000 records Rate unpack substr lrefs unpack 1.48/s -- -17% -40% substr 1.78/s 20% -- -28% lrefs 2.46/s 66% 38% -- #### #! 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; } ], };