Commit | Line | Data |
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 | |
32 | use Benchmark qw(cmpthese); |
33 | use Benchmark ':hireswallclock'; |
34 | |
734d1752 |
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; |
b584a6bc |
39 | |
45922f54 |
40 | my $acc_rounds = -1; |
41 | my $ins_rounds = -1; |
b584a6bc |
42 | |
43 | print "\nSETTING\n"; |
44 | cmpthese($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 | |
51 | print "\nGETTING\n"; |
52 | cmpthese($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 | |
59 | my (@moose, @moose_immut, @moose_immut_no_const, @caf_stall); |
60 | print "\nCREATION\n"; |
61 | cmpthese($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 | |
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 | }, |
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 | |