grok_number ppport.h fixes
[gitmo/Moose.git] / benchmarks / caf_vs_moose.pl
1 #!perl
2
3 ### MODULES
4
5 {
6     package PlainMoose;
7     use Moose;
8     has foo => (is => 'rw');
9 }
10 {
11     package MooseImmutable;
12     use Moose;
13     has foo => (is => 'rw');
14     __PACKAGE__->meta->make_immutable();
15 }
16 {
17     package MooseImmutable::NoConstructor;
18     use Moose;
19     has foo => (is => 'rw');
20     __PACKAGE__->meta->make_immutable(inline_constructor => 0);
21     __PACKAGE__->meta->get_attribute("foo")->Moose::XS::new_accessor(__PACKAGE__ . "::foo");
22
23 }
24 {
25     package ClassAccessorFast;
26     use warnings;
27     use strict;
28     use base 'Class::Accessor::Fast';
29     __PACKAGE__->mk_accessors(qw(foo));
30 }
31
32 use Benchmark qw(cmpthese);
33 use Benchmark ':hireswallclock';
34
35 my $moose                = PlainMoose->new;
36 my $moose_immut          = MooseImmutable->new;
37 my $moose_immut_no_const = MooseImmutable::NoConstructor->new;
38 my $caf                  = ClassAccessorFast->new;
39
40 my $acc_rounds = -1;
41 my $ins_rounds = -1;
42
43 print "\nSETTING\n";
44 cmpthese($acc_rounds, {
45     Moose                       => sub { $moose->foo(23) },
46     MooseImmutable              => sub { $moose_immut->foo(23) },
47     MooseImmutableNoConstructor => sub { $moose_immut_no_const->foo(23) },
48     ClassAccessorFast           => sub { $caf->foo(23) },
49 }, 'noc');
50
51 print "\nGETTING\n";
52 cmpthese($acc_rounds, {
53     Moose                       => sub { $moose->foo },
54     MooseImmutable              => sub { $moose_immut->foo },
55     MooseImmutableNoConstructor => sub { $moose_immut_no_const->foo },
56     ClassAccessorFast           => sub { $caf->foo },
57 }, 'noc');
58
59 my (@moose, @moose_immut, @moose_immut_no_const, @caf_stall);
60 print "\nCREATION\n";
61 cmpthese($ins_rounds, {
62     Moose                       => sub { push @moose, PlainMoose->new(foo => 23) },
63     MooseImmutable              => sub { push @moose_immut, MooseImmutable->new(foo => 23) },
64     MooseImmutableNoConstructor => sub { push @moose_immut_no_const, MooseImmutable::NoConstructor->new(foo => 23) },
65     ClassAccessorFast           => sub { push @caf_stall, ClassAccessorFast->new({foo => 23}) },
66 }, 'noc');
67
68 my ( $moose_idx, $moose_immut_idx, $moose_immut_no_const_idx, $caf_idx ) = ( 0, 0, 0, 0 );
69 print "\nDESTRUCTION\n";
70 cmpthese($ins_rounds, {
71     Moose => sub {
72         $moose[$moose_idx] = undef;
73         $moose_idx++;
74     },
75     MooseImmutable => sub {
76         $moose_immut[$moose_immut_idx] = undef;
77         $moose_immut_idx++;
78     },
79     MooseImmutableNoConstructor => sub {
80         $moose_immut_no_const[$moose_immut_no_const_idx] = undef;
81         $moose_immut_no_const_idx++;
82     },
83     ClassAccessorFast   => sub {
84         $caf_stall[$caf_idx] = undef;
85         $caf_idx++;
86     },
87 }, 'noc');
88
89