Add two benchmark files
[gitmo/Mouse.git] / benchmarks / class_type.pl
diff --git a/benchmarks/class_type.pl b/benchmarks/class_type.pl
new file mode 100644 (file)
index 0000000..4ab1ead
--- /dev/null
@@ -0,0 +1,68 @@
+#!perl
+use strict;
+use warnings;
+use Benchmark qw/cmpthese/;
+
+{
+    package Foo;
+    sub new{ bless {}, shift }
+}
+
+eval q{
+    package C::XSAOne;
+    use Class::XSAccessor
+        constructor => 'new',
+        accessors   => { n => 'n' },
+    ;
+    1;
+};
+
+for my $klass (qw/Moose Mouse/) {
+    eval qq{
+        package ${klass}One;
+        use $klass;
+
+        has n => (
+            is  => 'rw',
+            isa => 'Foo',
+        );
+        no $klass;
+        __PACKAGE__->meta->make_immutable;
+    };
+    die $@ if $@;
+}
+
+print "Class::MOP: $Class::MOP::VERSION\n";
+print "Moose:      $Moose::VERSION\n";
+print "Mouse:      $Mouse::VERSION\n";
+print "---- new\n";
+
+my $foo = Foo->new();
+
+my @classes = qw(Moose Mouse);
+if(C::XSAOne->can('new')){
+    push @classes, 'C::XSA';
+}
+
+cmpthese(
+    -1 => {
+        map { my $x = $_; $_ => sub { $x->new(n => $foo) } }
+        map { "${_}One" } @classes
+    }
+);
+
+print "---- new,set\n";
+cmpthese(
+    -1 => {
+        map { my $y = $_; $_ => sub { $y->new(n => $foo)->n($foo) } }
+        map { "${_}One" } @classes
+    }
+);
+
+print "---- set\n";
+my %c = map { $_ => "${_}One"->new(n => $foo) } @classes;
+cmpthese(
+    -1 => {
+        map { my $y = $_; $_ => sub { $c{$y}->n($foo) } } @classes
+    }
+);