in reply to Re: Challenge: Construct an unpack string
in thread Challenge: Construct an unpack string

Actually, if you agree that the following code would be valid for a benchmark, then you might be surprised.

Code:

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

Results (1_000_000 iterations):

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)

I must say I was surprised. I included the times for "setup"-that is, everything but the operation itself, on the idea that perhaps the setup might have taken longer for the one method than another. Thoughts....?

Update (26-Sept-2006): Updated formatting of results.

Update (26-Sept-2006): Fixed typo. (Thanks to BrowserUk for pointing it out.)

Update (26-Sept-2006): Fixed 2nd typo. (Thanks to chargrill for pointing it out.)

Replies are listed 'Best First'.
Re^3: Challenge: Construct an unpack string
by BrowserUk (Patriarch) on Sep 26, 2006 at 19:17 UTC

    If you hardcode the template to unpack, of course it will be quicker--but when the input data changes, the template won't without programmer intervention--which kinda negates the value of the benchmark.

    Actually, your entire benchmark is pretty suspect and you are comparing a bunch of entirely different things:

    1. A hardcoded unpack.
    2. Two different implementations of the original challenge: parsing the data according to the contents of the input structure.
    3. Three other bit of random code that do nothing in particlar to do with the problem--your "setup" stuff.

    So, no. I wouldn't agree that this is a valid benchmark :) Sorry.

    Also, please use cmpthese for benchmarking, the output from timethese is all but unintelligable.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
Re^3: Challenge: Construct an unpack string
by BrowserUk (Patriarch) on Sep 26, 2006 at 19:22 UTC

    What the hell is Q?

    map sprintf( q[x%d a%d X%d], Q{ $_-[1] }{qw[start len] +}, $_->[1] .............................................^

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.