summaryrefslogtreecommitdiff
path: root/benchmarks/method_modifiers.pl
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/method_modifiers.pl')
-rwxr-xr-xbenchmarks/method_modifiers.pl116
1 files changed, 116 insertions, 0 deletions
diff --git a/benchmarks/method_modifiers.pl b/benchmarks/method_modifiers.pl
new file mode 100755
index 0000000..ac860a9
--- /dev/null
+++ b/benchmarks/method_modifiers.pl
@@ -0,0 +1,116 @@
+#!perl
+
+### MODULES
+
+{
+ package PlainParent;
+ sub new { bless {} => shift }
+ sub method { "P" }
+}
+{
+ package MooseParent;
+ use Moose;
+ sub method { "P" }
+}
+
+{
+ package CMMChild::Before;
+ use Class::Method::Modifiers;
+ use base 'PlainParent';
+
+ before method => sub { "B" };
+}
+{
+ package MooseBefore;
+ use Moose;
+ extends 'MooseParent';
+
+ before method => sub { "B" };
+}
+
+{
+ package CMMChild::Around;
+ use Class::Method::Modifiers;
+ use base 'PlainParent';
+
+ around method => sub { shift->() . "A" };
+}
+{
+ package MooseAround;
+ use Moose;
+ extends 'MooseParent';
+
+ around method => sub { shift->() . "A" };
+}
+
+{
+ package CMMChild::AllThree;
+ use Class::Method::Modifiers;
+ use base 'PlainParent';
+
+ before method => sub { "B" };
+ around method => sub { shift->() . "A" };
+ after method => sub { "Z" };
+}
+{
+ package MooseAllThree;
+ use Moose;
+ extends 'MooseParent';
+
+ before method => sub { "B" };
+ around method => sub { shift->() . "A" };
+ after method => sub { "Z" };
+}
+{
+ package CMM::Install;
+ use Class::Method::Modifiers;
+ use base 'PlainParent';
+}
+{
+ package Moose::Install;
+ use Moose;
+ extends 'MooseParent';
+}
+
+use Benchmark qw(cmpthese);
+use Benchmark ':hireswallclock';
+
+my $rounds = -5;
+
+my $cmm_before = CMMChild::Before->new();
+my $cmm_around = CMMChild::Around->new();
+my $cmm_allthree = CMMChild::AllThree->new();
+
+my $moose_before = MooseBefore->new();
+my $moose_around = MooseAround->new();
+my $moose_allthree = MooseAllThree->new();
+
+print "\nBEFORE\n";
+cmpthese($rounds, {
+ Moose => sub { $moose_before->method() },
+ ClassMethodModifiers => sub { $cmm_before->method() },
+}, 'noc');
+
+print "\nAROUND\n";
+cmpthese($rounds, {
+ Moose => sub { $moose_around->method() },
+ ClassMethodModifiers => sub { $cmm_around->method() },
+}, 'noc');
+
+print "\nALL THREE\n";
+cmpthese($rounds, {
+ Moose => sub { $moose_allthree->method() },
+ ClassMethodModifiers => sub { $cmm_allthree->method() },
+}, 'noc');
+
+print "\nINSTALL AROUND\n";
+cmpthese($rounds, {
+ Moose => sub {
+ package Moose::Install;
+ Moose::Install::around(method => sub {});
+ },
+ ClassMethodModifiers => sub {
+ package CMM::Install;
+ CMM::Install::around(method => sub {});
+ },
+}, 'noc');