#!/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 ); }, } );