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