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;
}
],
};