Benchmark: timing 200000 iterations of Big, Mat, Pak, St2, Str... Big: 10 wallclock secs ( 6.16 usr + 0.0 sys = 6.16 CPU) @ 32467.53/s (n=200000) Mat: 4 wallclock secs ( 4.72 usr + 0.0 sys = 4.72 CPU) @ 42372.88/s (n=200000) Pak: 5 wallclock secs ( 5.39 usr + 0.0 sys = 5.39 CPU) @ 37105.75/s (n=200000) St2: 4 wallclock secs ( 4.11 usr + 0.0 sys = 4.11 CPU) @ 48661.80/s (n=200000) Str: 5 wallclock secs ( 4.88 usr + 0.0 sys = 4.88 CPU) @ 40983.61/s (n=200000) Benchmark: timing 200000 iterations of Big, Mat, Pak, St2, Str... Big: 5 wallclock secs ( 6.13 usr + 0.0 sys = 6.13 CPU) @ 32626.43/s (n=200000) Mat: 3 wallclock secs ( 4.68 usr + 0.0 sys = 4.68 CPU) @ 42735.04/s (n=200000) Pak: 5 wallclock secs ( 5.38 usr + 0.0 sys = 5.38 CPU) @ 37174.72/s (n=200000) St2: 4 wallclock secs ( 4.11 usr + 0.0 sys = 4.11 CPU) @ 48661.80/s (n=200000) Str: 5 wallclock secs ( 4.88 usr + 0.0 sys = 4.88 CPU) @ 40983.61/s (n=200000) Benchmark: timing 200000 iterations of Big, Mat, Pak, St2, Str... Big: 6 wallclock secs ( 6.12 usr + 0.0 sys = 6.12 CPU) @ 32679.74/s (n=200000) Mat: 4 wallclock secs ( 4.71 usr + 0.0 sys = 4.71 CPU) @ 42462.85/s (n=200000) Pak: 10 wallclock secs ( 5.40 usr + 0.0 sys = 5.40 CPU) @ 37037.04/s (n=200000) St2: 3 wallclock secs ( 4.09 usr + 0.0 sys = 4.09 CPU) @ 48899.76/s (n=200000) Str: 5 wallclock secs ( 4.97 usr + 0.0 sys = 4.97 CPU) @ 40241.45/s (n=200000) #### { my @points_str; sub st3_look { my $cells = shift; unless (@points_str) { for my $p (@points) { push @points_str, join(':', @$p); } } for my $p (@points_str) { exists $cells->{$p} or die; } exists $cells->{'notfound'} and die; exists $cells->{'notfound2'} and die; exists $cells->{'notfound3'} and die; } } my $str_ref = str_hash(); my $st2_ref = str_hash(); my $st3_ref = str_hash(); my $big_ref = big_hash(); my $pak_ref = pak_hash(); my $mat_ref = mat_hash(); timethese 200000, { Str => sub { str_look($str_ref) }, St2 => sub { st2_look($st2_ref) }, St3 => sub { st3_look($st3_ref) }, Big => sub { big_look($big_ref) }, Pak => sub { pak_look($pak_ref) }, Mat => sub { mat_look($mat_ref) }, }; #### Benchmark: timing 200000 iterations of Big, Mat, Pak, St2, St3, Str... Big: 6 wallclock secs ( 6.17 usr + 0.0 sys = 6.17 CPU) @ 32414.91/s (n=200000) Mat: 4 wallclock secs ( 4.77 usr + 0.0 sys = 4.77 CPU) @ 41928.72/s (n=200000) Pak: 6 wallclock secs ( 6.09 usr + 0.0 sys = 6.09 CPU) @ 32840.72/s (n=200000) St2: 4 wallclock secs ( 4.29 usr + 0.0 sys = 4.29 CPU) @ 46620.05/s (n=200000) St3: 2 wallclock secs ( 2.09 usr + 0.0 sys = 2.09 CPU) @ 95693.78/s (n=200000) Str: 5 wallclock secs ( 4.92 usr + 0.0 sys = 4.92 CPU) @ 40650.41/s (n=200000) Benchmark: timing 200000 iterations of Big, Mat, Pak, St2, St3, Str... Big: 6 wallclock secs ( 6.19 usr + 0.0 sys = 6.19 CPU) @ 32310.18/s (n=200000) Mat: 8 wallclock secs ( 4.78 usr + 0.0 sys = 4.78 CPU) @ 41841.00/s (n=200000) Pak: 6 wallclock secs ( 5.42 usr + 0.0 sys = 5.42 CPU) @ 36900.37/s (n=200000) St2: 5 wallclock secs ( 4.15 usr + 0.0 sys = 4.15 CPU) @ 48192.77/s (n=200000) St3: 2 wallclock secs ( 2.18 usr + 0.0 sys = 2.18 CPU) @ 91743.12/s (n=200000) Str: 5 wallclock secs ( 5.00 usr + 0.0 sys = 5.00 CPU) @ 40000.00/s (n=200000) Benchmark: timing 200000 iterations of Big, Mat, Pak, St2, St3, Str... Big: 6 wallclock secs ( 6.18 usr + 0.0 sys = 6.18 CPU) @ 32362.46/s (n=200000) Mat: 5 wallclock secs ( 4.66 usr + 0.0 sys = 4.66 CPU) @ 42918.45/s (n=200000) Pak: 5 wallclock secs ( 5.37 usr + 0.0 sys = 5.37 CPU) @ 37243.95/s (n=200000) St2: 3 wallclock secs ( 4.09 usr + 0.0 sys = 4.09 CPU) @ 48899.76/s (n=200000) St3: 1 wallclock secs ( 2.11 usr + 0.0 sys = 2.11 CPU) @ 94786.73/s (n=200000) Str: 4 wallclock secs ( 4.90 usr + 0.0 sys = 4.90 CPU) @ 40816.33/s (n=200000) #### sub st3_look { my $cells = shift; state @points_str = map { join ':', @{$_} } @points; ... } Initialization of state variables in list context currently forbidden at test.pl line 266, near "@points;" Execution of test.pl aborted due to compilation errors. #### use feature qw(state); sub st3_look { my $cells = shift; state $points_str = [ map { join ':', @{$_} } @points ]; for my $p (@{ $points_str }) { exists $cells->{$p} or die; } exists $cells->{'notfound'} and die; exists $cells->{'notfound2'} and die; exists $cells->{'notfound3'} and die; }