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