#!/usr/bin/perl -w use strict; use Benchmark qw(:all); timethese( 1_000_000, { 'unpack' => sub { my $str = q{0123456789abcdefghijklmnopqrstuvwxyz}; my ( $name1, $name3, $name2 ) = unpack( q{a10 a14 X16 a3), $str ); }, 'map_browseruk' => sub { my $str = q{0123456789abcdefghijklmnopqrstuvwxyz}; my @fields = ( [ name1 => { start => 0, len => 10 } ], [ name2 => { start => 8, len => 3 } ], [ name3 => { start => 11, len => 14 } ], ); my ( $name1, $name2, $name3 ) = map { substr $str, $_->[1]{start}, $_->[1]{len} } @fields; }, 'unpack_setup' => sub { my $str = q{0123456789abcdefghijklmnopqrstuvwxyz}; my ( $name1, $name3, $name2 ); }, 'map_browseruk_setup' => sub { my $str = q{0123456789abcdefghijklmnopqrstuvwxyz}; my @fields = ( [ name1 => { start => 0, len => 10 } ], [ name2 => { start => 8, len => 3 } ], [ name3 => { start => 11, len => 14 } ], ); my ( $name1, $name2, $name3 ); }, 'map_jwkrahn' => sub { my $str = q{0123456789abcdefghijklmnopqrstuvwxyz}; my @fields = ( [ name1 => { start => 0, len => 10 } ], [ name2 => { start => 8, len => 3 } ], [ name3 => { start => 11, len => 14 } ], ); my $format = join q[ ], map sprintf( q[x%d a%d X%d], @{ $_-[1] }{qw[start len]}, $_->[1]{start} + $_->[1]{len} ), @fields; my ( $name1, $name2, $name3 ) = unpack( $format, $str ); }, 'map_jwkrahn_setup' => sub { my $str = q{0123456789abcdefghijklmnopqrstuvwxyz}; my @fields = ( [ name1 => { start => 0, len => 10 } ], [ name2 => { start => 8, len => 3 } ], [ name3 => { start => 11, len => 14 } ], ); my $format = join q[ ], map sprintf( q[x%d a%d X%d], @{ $_-[1] }{qw[start len]}, $_->[1]{start} + $_->[1]{len} ), @fields; my ( $name1, $name2, $name3 ); }, } ); #### Benchmark: timing 1000000 iterations of map_browseruk, map_browseruk_setup, map_jwkrahn, map_jwkrahn_setup, unpack, unpack_setup... map_browseruk: 16 wallclock secs (14.77 usr + 0.04 sys = 14.81 CPU) @ 67521.94/s (n=1000000) map_browseruk_setup: 9 wallclock secs ( 9.27 usr + 0.03 sys = 9.30 CPU) @ 107526.88/s (n=1000000) map_jwkrahn: 29 wallclock secs (23.17 usr + 0.04 sys = 23.21 CPU) @ 43084.88/s (n=1000000) map_jwkrahn_setup: 23 wallclock secs (20.23 usr + 0.03 sys = 20.26 CPU) @ 49358.34/s (n=1000000) unpack: 4 wallclock secs ( 2.43 usr + 0.00 sys = 2.43 CPU) @ 411522.63/s n=1000000) unpack_setup: 1 wallclock secs ( 0.44 usr + 0.00 sys = 0.44 CPU) @ 2272727.27/s (n=1000000)