#!/usr/bin/perl -w package Bench::Base; sub new { my($class) = shift; bless { test => 23 }, $class; } package Bench::Direct; use base qw(Bench::Base); package Bench::ByHand; use base qw(Bench::Base); sub test { my($self) = shift; if( @_ ) { $self->{test} = (@_ == 1 ? $_[0] : [@_]); } return $self->{test}; } package Bench::Class::Accessor; use base qw(Class::Accessor); __PACKAGE__->mk_accessors(qw(test)); package Bench::Class::Accessor::Fast; use base qw(Class::Accessor::Fast); __PACKAGE__->mk_accessors(qw(test)); package Bench::Class::Accessor::Faster; use base qw(Class::Accessor::Faster); __PACKAGE__->mk_accessors(qw(test)); my %init = ( test => 23 ); my $ca = Bench::Class::Accessor->new(\%init); my $fast = Bench::Class::Accessor::Fast->new(\%init); my $faster = Bench::Class::Accessor::Faster->new(\%init); my $direct = Bench::Direct->new; my $byhand = Bench::ByHand->new; my $foo; my $control = 42; package main; use Benchmark 'cmpthese'; use strict; print "accessors:\n"; cmpthese( -1, { 'Basic' => sub { $foo = $ca->test; }, 'Fast' => sub { $foo = $fast->test; }, 'Faster' => sub { $foo = $faster->test; }, 'Average' => sub { $foo = $byhand->test; }, 'Direct' => sub { $foo = $direct->{test}; } } ); print "mutators:\n"; cmpthese( -1, { 'Acc' => sub { $ca->test(42); }, 'Fast' => sub { $fast->test(42); }, 'Faster' => sub { $faster->test(42); }, 'By hand' => sub { $byhand->test(42); }, 'Direct' => sub { $direct->{test} = 42; } } );