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
>

Reply via email to