No duplication
[gitmo/Mouse.git] / benchmarks / vs_caf.pl
1 #!perl
2
3 ### MODULES
4
5
6 {
7     package PlainMoose;
8     use Moose;
9     has foo => (is => 'rw');
10     __PACKAGE__->meta->make_immutable();
11 }
12 {
13     package PlainMouse;
14     use Mouse;
15     has foo => (is => 'rw');
16     __PACKAGE__->meta->make_immutable();
17 }
18 {
19     package ClassAccessorFast;
20     use warnings;
21     use strict;
22     use base 'Class::Accessor::Fast';
23     __PACKAGE__->mk_accessors(qw(foo));
24 }
25
26 use Benchmark qw(cmpthese);
27
28 my $moose                = PlainMoose->new;
29 my $mouse                = PlainMouse->new;
30 my $caf                  = ClassAccessorFast->new;
31
32
33 print "\nSETTING\n";
34 cmpthese(-1, {
35     Moose                       => sub { $moose->foo(23) },
36     Mouse                       => sub { $mouse->foo(23) },
37     ClassAccessorFast           => sub { $caf->foo(23) },
38 }, 'noc');
39
40 print "\nGETTING\n";
41 cmpthese(-1, {
42     Moose                       => sub { $moose->foo },
43     Mouse                       => sub { $mouse->foo },
44     ClassAccessorFast           => sub { $caf->foo },
45 }, 'noc');
46
47 my (@moose, @moose_immut, @mouse, @mouse_immut, @caf_stall);
48 print "\nCREATION\n";
49 cmpthese(1_000_000, {
50     Moose                       => sub { push @moose, PlainMoose->new(foo => 23) },
51     Mouse                       => sub { push @mouse, PlainMouse->new(foo => 23) },
52     ClassAccessorFast           => sub { push @caf_stall, ClassAccessorFast->new({foo => 23}) },
53 }, 'noc');
54
55 my ( $moose_idx, $mouse_idx, $caf_idx ) = ( 0, 0, 0, 0 );
56 print "\nDESTRUCTION\n";
57 cmpthese(1_000_000, {
58     Moose => sub {
59         $moose[$moose_idx] = undef;
60         $moose_idx++;
61     },
62     Mouse => sub {
63         $mouse[$mouse_idx] = undef;
64         $mouse_idx++;
65     },
66     ClassAccessorFast   => sub {
67         $caf_stall[$caf_idx] = undef;
68         $caf_idx++;
69     },
70 }, 'noc');
71
72