use Benchmark qw(cmpthese timeit); package My::Funky::Class; sub foo { print "hi\n"; } package main; $My::Funky::Class::mirrors = { $package => 'foo' }; mytimethese(500_000, { stringref => sub { my %foo = %{"$package\::"}; }, 'bless_variable' => sub { bless {}, $package; }, 'bless_constant' => sub { bless {}, 'My::Funky::Class'; }, }); sub get_package { my $string = shift; my $pkg = \%main::; foreach (split(/::/, $string)) {$pkg = $pkg->{"$_\::"};} return $pkg; } sub mytimethese { my($iter, $codehash) = @_; foreach my $desc (sort keys %$codehash) { print "$desc:" . ' 'x(50-length($desc)); my $time = timeit($iter, $codehash->{$desc}); print sprintf('%8.2f usec', ($time->[1]+$time->[2])*1_000_000/$time->[5])."\n"; } }