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
