Re: local vs. my
[email protected] (Stefan `Sec` Zehl) Sat, 9 Sep 2006 12:36:42 +0200
| Newsgroups | perl.fwp |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Sep 08, 2006 at 23:38 -0400, Uri Guttman wrote: > >>>>> "CD" == Chris Dolan <[email protected]> writes: > > CD> Changing the topic a little bit... I've always suspected there was a > CD> speed difference between local and my. So, I just benchmarked the > CD> two versions, and "my" wins by a wide margin: [...] > makes perfect sense. my vars are not in the symbol table and just need > an initialization at run time and they exist in the pad of a sub. localized > vars need to save the previous value in some form of a stack (real work) > and also get initialized. so local should be slower. And using no variable is again quite a bit faster (A thing I found very disappointing for the sake of readable code). | ice:~/some_random_test>./perl_local_my_speed_test.pl | Rate local my global novar | local 549356/s -- -16% -22% -39% | my 656410/s 19% -- -7% -27% | global 703297/s 28% 7% -- -21% | novar 895105/s 63% 36% 27% -- | ice:~/some_random_test>perl -v | | This is perl, v5.8.8 built for i386-freebsd-64int | (with 1 registered patch, see perl -V for more detail) Here is the modified script. #!/usr/bin/perl -w use strict; use Benchmark qw(cmpthese); cmpthese(1_000_000, { 'local' => sub { flatten_copy_local('bar'); }, 'my' => sub { flatten_copy_my('bar'); }, 'global' => sub { flatten_copy_global('bar'); }, 'novar' => sub { flatten_copy_novar('bar'); }, }); sub flatten_copy_local { local $_ = shift; ref $_ eq 'SCALAR' ? "$$_" : "$_"; } sub flatten_copy_my { my $s = shift; ref $s eq 'SCALAR' ? "$$s" : "$s"; } sub flatten_copy_novar { ref $_[0] eq 'SCALAR' ? "${$_[0]}" : "$_[0]"; } no strict 'vars'; sub flatten_copy_global { $s = shift; ref $s eq 'SCALAR' ? "$$s" : "$s"; } ============== CU, Sec -- The Feynman problem solving Algorithm 1) Write down the problem 2) Think real hard 3) Write down the answer