my %data; foreach my $x (1..5000) { $data{$x} = {} unless $data{$x}; foreach my $y (1..1000) { $data{$x}{$y} = {} unless $data{$x}{$y}; } } real 0m4.075s user 0m3.767s sys 0m0.289s #### use threads; use threads::shared; my %data:shared; foreach my $x (1..5000) { $data{$x} = &share( {} ) unless $data{$x}; foreach my $y (1..1000) { $data{$x}{$y} = &share( {} ) unless $data{$x}{$y}; } } real 1m4.984s user 1m4.211s ! that's ~16x times slower that the non-shared case sys 0m0.540s