Create a gist now

Instantly share code, notes, and snippets.

MooseX::Method::Signatures vs Method::Signatures vs PurePerl
{
package WithMXMS;
use Moose;
use MooseX::Method::Signatures;
method gndn {}
}
{
package WithMXMS_immutable;
use Moose;
use MooseX::Method::Signatures;
method gndn {}
__PACKAGE__->meta->make_immutable;
}
{
package PurePerl;
sub new { bless {}, shift };
sub gndn {}
# To match what MXMS and MS do
sub gndn_with_shift { my $self = shift; }
}
# Demonstrating that MS is being affected by a Perl performance issue
# with aliased function calls.
{
package PurePerl_alias;
sub new { bless {}, shift };
*gndn = sub {};
# To match what MXMS and MS do
*gndn_with_shift = sub { my $self = shift; };
}
{
package MS_method;
use Method::Signatures;
sub new { bless {}, shift };
method gndn {}
# Disable all argument checks
method gndn_no_check (@_) {}
}
{
package MS_func;
use Method::Signatures;
func gndn {}
# Disable all argument checks
func gndn_no_check (@_) {}
}
use v5.14;
use Time::HiRes qw(time);
my $Runs = 15_000;
say "Running $Runs empty method calls each";
{
my $obj = WithMXMS->new;
my $start = time;
$obj->gndn for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for MooseX::Method::Signatures method call";
}
{
my $obj = WithMXMS_immutable->new;
my $start = time;
$obj->gndn for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for MooseX::Method::Signatures method call (immutable)";
}
{
my $obj = PurePerl->new;
my $start = time;
$obj->gndn for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Pure Perl method call";
}
{
my $obj = PurePerl->new;
my $start = time;
$obj->gndn_with_shift for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Pure Perl method call with 'my \$self = shift'";
}
{
my $start = time;
PurePerl::gndn() for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Pure Perl function call";
}
{
my $obj = PurePerl_alias->new;
my $start = time;
$obj->gndn for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Pure Perl aliased method call";
}
{
my $obj = PurePerl_alias->new;
my $start = time;
$obj->gndn_with_shift for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Pure Perl aliased method call with 'my \$self = shift'";
}
{
my $start = time;
PurePerl_alias::gndn() for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Pure Perl aliased function call";
}
{
my $obj = MS_method->new;
my $start = time;
$obj->gndn for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Method::Signatures method call";
}
{
my $obj = MS_method->new;
my $start = time;
$obj->gndn_no_check for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Method::Signatures method call with no arg checks";
}
{
my $start = time;
MS_func::gndn() for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Method::Signatures func call";
}
{
my $start = time;
MS_func::gndn_no_check() for 1..$Runs;
my $end = time;
say +($end - $start)." seconds for Method::Signatures func call with no arg checks";
}
__END__
(Results with Perl 5.14.1 on Macbook i7/2.7Ghz)
(Method::Signatures 20110923.1726)
(MooseX::Method::Signatures 0.37)
Running 15000 empty method calls each
1.07040405273438 seconds for MooseX::Method::Signatures method call
1.06590795516968 seconds for MooseX::Method::Signatures method call (immutable)
0.00235891342163086 seconds for Pure Perl method call
0.00326395034790039 seconds for Pure Perl method call with 'my $self = shift'
0.00190520286560059 seconds for Pure Perl function call
0.00234508514404297 seconds for Pure Perl aliased method call
0.0032198429107666 seconds for Pure Perl aliased method call with 'my $self = shift'
0.00182890892028809 seconds for Pure Perl aliased function call
0.00393080711364746 seconds for Method::Signatures method call
0.00322699546813965 seconds for Method::Signatures method call with no arg checks
0.00242090225219727 seconds for Method::Signatures func call
0.00255417823791504 seconds for Method::Signatures func call with no arg checks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment