#!/usr/bin/perl my %innerdata; @innerdata{a..z} = a..z; my $data = { foo => { %innerdata }, bar => { %innerdata } }; sub foo { my $data = $_[0]; for $key1 (keys %$data) { for $key2 (keys %{$data->{$key1}}) { my $val = $data->{$key1}->{$key2}; # process $val; # print $val; } } } sub bar { my $data = $_[0]; for $key1 (keys %$data) { my $data2 = $data->{$key1}; for $key2 (keys %$data2) { my $val = $data2->{$key2}; # process $val; # print $val; } } } use Benchmark qw(cmpthese); cmpthese( 100000, { multiple_indirection => sub { foo($data) }, reduced_indirection => sub { bar($data) }, } )