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