#! perl -slw use strict; use Benchmark qw[ cmpthese ]; my %data_cache; sub to_cache { my $ticker = shift; my $data = shift; my @list; foreach(@$data) { push @list, pack("A10FFFFL", @$_); } $data_cache{$ticker} = \@list; } sub from_cache { my $ticker = shift; my $data = $data_cache{$ticker}; my @rval; foreach (@$data) { my @row = unpack("A10FFFFL", $_); push @rval, \@row; } return \@rval; } my %cache2; sub to_cache2 { my( $ticker, $data ) = @_; $cache2{$ticker} = [ map pack("A10FFFFL", @$_), @$data ]; } sub from_cache2 { my $ticker = shift; return [ map unpack("A10FFFFL", $_), $cache2{$ticker} ]; } our @AoA = map[ '20110106', map( rand( 1e5), 1..4 ), int( rand 1000 ) ], 1 .. 251; cmpthese -1, { orig => sub { to_cache( $_, \@AoA ) for 1 .. 100; my $ref = from_cache( $_ ) for 1 .. 100; }, mod1 => sub { to_cache2( $_, \@AoA ) for 1 .. 100; my $ref = from_cache2( $_ ) for 1 .. 100; }, }; __END__ C:\test>880868-2 Rate orig mod1 orig 8.13/s -- -76% mod1 33.4/s 310% --