neodon has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I'm just curious about these variations in performance between creating subs at run-time vs compile-time. Does anyone have some insight into what's going on behind the scenes?

#!/usr/bin/perl use Benchmark; BEGIN { *begin = sub {} } INIT { *init = sub {} } sub declared {} *runtime = sub {}; timethese(50000, { begin => sub { begin for (1 .. 1000) }, init => sub { init for (1 .. 1000) }, declared => sub { declared for (1 .. 1000) }, runtime => sub { runtime for (1 .. 1000) } });

Results:

Benchmark: timing 50000 iterations of begin, declared, init, runtime...
     begin:  9 wallclock secs ( 9.31 usr +  0.01 sys =  9.32 CPU) @ 5364.81/s (n=50000)
  declared: 10 wallclock secs ( 9.54 usr +  0.01 sys =  9.55 CPU) @ 5235.60/s (n=50000)
      init:  2 wallclock secs ( 2.11 usr +  0.00 sys =  2.11 CPU) @ 23696.68/s (n=50000)
   runtime:  2 wallclock secs ( 2.08 usr +  0.00 sys =  2.08 CPU) @ 24038.46/s (n=50000)
I am running Perl v5.10.0 on Ubuntu 9.04 (Jaunty) x86_64 2.6.28-17-generic. Let me know if you need more info. Thanks!
  • Comment on Subs created at run-time are faster than those created at compile-time
  • Download Code

Replies are listed 'Best First'.
Re: Subs created at run-time are faster than those created at compile-time
by ikegami (Patriarch) on Dec 15, 2009 at 15:10 UTC
    You're code is the same as
    timethese(50000, { begin => sub { begin() for 1 .. 1000 }, init => sub { "init" for 1 .. 1000 }, declared => sub { declared() for 1 .. 1000 }, runtime => sub { "runtime" for 1 .. 1000 }, });

    so I'm not surprised init and runtime are faster. Use use strict; use warnings;!!!

Re: Subs created at run-time are faster than those created at compile-time
by Anonymous Monk on Dec 15, 2009 at 15:11 UTC
    There is no difference ;)
    #!/usr/bin/perl -- use strict; use warnings; use Benchmark qw' cmpthese '; BEGIN { *begin = sub {} } INIT { *init = sub {} } sub declared {} *runtime = sub {}; cmpthese(-3, { begin => sub { begin() for (1 .. 1000) }, init => sub { init() for (1 .. 1000) }, declared => sub { declared() for (1 .. 1000) }, runtime => sub { runtime() for (1 .. 1000) } }); __END__
    $ perl temp.pl Rate declared init runtime begin declared 1663/s -- -0% -3% -6% init 1670/s 0% -- -3% -6% runtime 1722/s 4% 3% -- -3% begin 1772/s 7% 6% 3% -- $ perl temp.pl Rate begin init runtime declared begin 1607/s -- -1% -1% -9% init 1621/s 1% -- -1% -8% runtime 1630/s 1% 1% -- -8% declared 1770/s 10% 9% 9% -- $ perl temp.pl Rate declared runtime begin init declared 1622/s -- -2% -3% -4% runtime 1655/s 2% -- -1% -2% begin 1668/s 3% 1% -- -1% init 1686/s 4% 2% 1% -- $ perl temp.pl Rate runtime init begin declared runtime 1551/s -- -6% -7% -11% init 1658/s 7% -- -0% -5% begin 1661/s 7% 0% -- -4% declared 1737/s 12% 5% 5% --
Re: Subs created at run-time are faster than those created at compile-time
by neodon (Novice) on Dec 15, 2009 at 15:37 UTC
    Well, that was rather silly of me! Thank you for the responses. I also think I should use cmpthese more often. :)