6 Class::Accessor::Grouped
9 Class::Accessor::Fast::XS
10 Class::XSAccessor::Compat
16 eval "require $_" or push @missing, $_;
20 die sprintf "Missing modules necessary for benchmark:\n\n%s\n\n",
21 join ("\n", @missing);
26 use Benchmark qw/:hireswallclock cmpthese/;
29 package Bench::Accessor;
35 use base qw/Class::Accessor::Grouped Class::Accessor::Fast/;
36 use Class::XSAccessor { accessors => [ 'xsa' ] };
39 local $Class::Accessor::Grouped::USE_XS = 0;
40 __PACKAGE__->mk_group_accessors ('simple', 'cag');
43 local $Class::Accessor::Grouped::USE_XS = 1;
44 __PACKAGE__->mk_group_accessors ('simple', 'cag_xs');
46 __PACKAGE__->mk_accessors('caf');
49 require Class::Accessor::Fast::XS;
50 local @ISA = 'Class::Accessor::Fast::XS';
51 __PACKAGE__->mk_accessors ('caf_xs');
55 require Class::XSAccessor::Compat;
56 local @ISA = 'Class::XSAccessor::Compat';
57 __PACKAGE__->mk_accessors ('caf_xsa');
61 @_ > 1 ? $_[0]->{handmade} = $_[1] : $_[0]->{handmade};
66 base => bless ({}, 'Bench::Accessor')
70 my ($tasks, $name, $class) = @_;
73 my $gen_class = "Bench::Accessor::$class";
77 has $meth => (is => 'rw');
78 # some moosey thingies can not do this
79 eval { __PACKAGE__->meta->make_immutable };
82 $bench_objs->{$name} = $gen_class->new;
83 _add_task ($tasks, $name, $meth, $name);
87 my ($tasks, $name, $meth, $slot) = @_;
92 \$bench_objs->{$slot}->$meth($_);
93 \$bench_objs->{$slot}->$meth(\$bench_objs->{$slot}->$meth + $_);
97 $tasks->{$name} = eval "sub { $perl } ";
102 # $bench_objs->{base}{direct} = 1;
103 # $bench_objs->{base}{direct} = $bench_objs->{base}{direct} + 1;
107 for (qw/CAG CAG_XS CAF CAF_XS CAF_XSA XSA HANDMADE/) {
108 _add_task ($tasks, $_, lc($_), 'base');
117 for (keys %$moose_based) {
118 _add_moose_task ($tasks, $_, $moose_based->{$_})
123 local $Method::Generate::Accessor::CAN_HAZ_XS = 0;
124 _add_moose_task ($tasks, moo => 'Moo');
128 print "Perl $], take $_:\n";
129 cmpthese ( -1, $tasks );