On Mon, Nov 16, 2009 at 09:20:37AM -0600, Nick Perez wrote:
> On Sun, 15 Nov 2009 21:02:25 -0800
> abhijit mahabal <[email protected]> wrote:
> 
> > Hi Moose folks,
> >   I recently began converting my PhD code from Class::Std to
> > MooseX::Declare. (I started to write that code over 5 years ago, hence
> > Class::Std).
> > 
> > I have run into a slowness roadblock, however, and I feel I must be
> > doing something wrong. I was under the impression that I would only be
> > paying compile time costs, but the runtime costs I have run into are
> > prohibitive. I have included a benchmark script below.
> > 
> > I am using perl5.10.1 on Ubuntu, MX::Declare 0.32,
> > MooseX::Method::Signatures 0.29.
> > 
> > ============
> >                           Rate method_without_type method_with_type
> > regular_sub
> > method_without_type   4374/s                  --
> > -7%           -99% method_with_type      4721/s
> > 8%               --           -99% regular_sub
> > 389610/s               8808%            8152%             --
> > ============= use MooseX::Declare;
> > 
> > class Foo {
> >   has x => (
> >     is  => 'rw',
> >     isa => 'Str',
> >   );
> > 
> >   # I use the three vars below to ensure that the subs
> >   # are not constant-folded away.
> >   our $meth_counter        = 0;
> >   our $meth_typed_counter  = 0;
> >   our $regular_sub_counter = 0;
> > 
> >   method method_with_type( Int $x ) {
> >     $meth_typed_counter++;
> >     $self->x . $x
> >   };
> > 
> >   method method_without_type($x) {
> >     $meth_counter++;
> >     $self->x . $x
> >   };
> > 
> >   sub regular_sub {
> >     my ( $self, $x ) = @_;
> >     $regular_sub_counter++;
> >     $self->x . $x;
> >   }
> > 
> > };
> > 
> > package main;
> > use Benchmark qw(:all);
> > 
> > my $foo = Foo->new( { x => "3" } );
> > cmpthese(
> >   300000,
> >   {
> >     regular_sub         => sub { $foo->regular_sub(5) },
> >     method_without_type => sub { $foo->method_without_type(5) },
> >     method_with_type    => sub { $foo->method_with_type(5) }
> >   }
> > );
> > =============
> > 
> > 
> > Is this expected? If not, what am I doing wrong? And why does adding a
> > type *speed* things up (by 8% in the example above)? That's
> > counterintuitive, to me.
> > 
> > Thanks much,
> > --abhijit
> > 
> 
> 
> You have to understand what kind of magic is happening behind the
> scenes to realize that methods can be heavy. First, the type constraint
> system alone will slow things down. Also, the provided arguments to a
> method are munged to allow for things like named parameters. And then
> the sub is basically rewritten (MXD is a glorified source filter but
> using perl to parse Perl) to account for all of that. If you are
> interested in the gory details, take a look inside
> MooseX::Method::Signatures::Meta::Method. 
> 
> So that answers to the general slowness, as for why adding a type
> speeds things up, that is a question for Florian. You are welcome to
> join the #devel-declare channel on irc.perl.org, most of the MXD people
> hang out there.

Also, to clarify things a bit, with plain Moose you should have minimal
runtime overhead, which is probably what you had been hearing.
MooseX::Declare does quite a bit beyond Moose, and some of these things
affect runtime speed, as Nick said.

-doy

Reply via email to