I'm currently working on optimizing MooseX::Types::Structured, which is what MXD uses for its type constraints. Hopefully any optimizations there will help speed MXD up.
On Mon, Nov 16, 2009 at 4:20 PM, abhijit mahabal <amaha...@gmail.com> wrote: > Thanks for your replies. > > The best route for me, then, seems to be to go ahead and use > MX::Declare --- it really is handy! --- profile, and make the most > heavily used stuff regular subs (instead of methods()). > > --abhijit > > > On Mon, Nov 16, 2009 at 7:42 AM, Jesse Luehrs <d...@tozt.net> wrote: >> On Mon, Nov 16, 2009 at 09:20:37AM -0600, Nick Perez wrote: >>> On Sun, 15 Nov 2009 21:02:25 -0800 >>> abhijit mahabal <amaha...@gmail.com> 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 >> > > > > -- > -- Abhijit >