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