Add a benchmark for method modifiers
gfx [Fri, 25 Sep 2009 09:30:51 +0000 (18:30 +0900)]
benchmarks/modifiers.pl [new file with mode: 0644]

diff --git a/benchmarks/modifiers.pl b/benchmarks/modifiers.pl
new file mode 100644 (file)
index 0000000..d8b286f
--- /dev/null
@@ -0,0 +1,119 @@
+#!perl -w
+use strict;
+use Benchmark qw(:all);
+
+use Config;
+
+use Moose ();
+use Mouse ();
+use Class::Method::Modifiers ();
+
+printf "Perl %vd on $Config{archname}\n", $^V;
+my @mods = qw(Moose Mouse Class::Method::Modifiers);
+
+if(eval{ require  Class::Method::Modifiers::Fast }){
+    push @mods, 'Class::Method::Modifiers::Fast';
+}
+
+foreach my $class(@mods){
+    print "$class ", $class->VERSION, "\n";
+}
+print "\n";
+
+{
+    package Base;
+    sub f{ 42 }
+    sub g{ 42 }
+    sub h{ 42 }
+}
+
+my $i = 0;
+sub around{
+    my $next = shift;
+    $i++;
+    goto &{$next};
+}
+{
+    package CMM;
+    use parent -norequire => qw(Base);
+    use Class::Method::Modifiers;
+
+    before f => sub{ $i++ };
+    around g => \&main::around;
+    after  h => sub{ $i++ };
+}
+{
+    package MooseClass;
+    use parent -norequire => qw(Base);
+    use Moose;
+
+    before f => sub{ $i++ };
+    around g => \&main::around;
+    after  h => sub{ $i++ };
+}
+{
+    package MouseClass;
+    use parent -norequire => qw(Base);
+    use Moose;
+
+    before f => sub{ $i++ };
+    around g => \&main::around;
+    after  h => sub{ $i++ };
+}
+
+print "Calling methods with before modifiers:\n";
+cmpthese -1 => {
+    CMM => sub{
+        my $old = $i;
+        CMM->f();
+        $i == ($old+1) or die $i;
+    },
+    Moose => sub{
+        my $old = $i;
+        MooseClass->f();
+        $i == ($old+1) or die $i;
+    },
+    Mouse => sub{
+        my $old = $i;
+        MouseClass->f();
+        $i == ($old+1) or die $i;
+    },
+};
+
+print "\n", "Calling methods with around modifiers:\n";
+cmpthese -1 => {
+    CMM => sub{
+        my $old = $i;
+        CMM->g();
+        $i == ($old+1) or die $i;
+    },
+    Moose => sub{
+        my $old = $i;
+        MooseClass->g();
+        $i == ($old+1) or die $i;
+    },
+    Mouse => sub{
+        my $old = $i;
+        MouseClass->g();
+        $i == ($old+1) or die $i;
+    },
+};
+
+print "\n", "Calling methods with after modifiers:\n";
+cmpthese -1 => {
+    CMM => sub{
+        my $old = $i;
+        CMM->h();
+        $i == ($old+1) or die $i;
+    },
+    Moose => sub{
+        my $old = $i;
+        MooseClass->h();
+        $i == ($old+1) or die $i;
+    },
+    Mouse => sub{
+        my $old = $i;
+        MouseClass->h();
+        $i == ($old+1) or die $i;
+    },
+};