#! perl -slw use strict; package OO_1; ## Blessed scalar; ## No named parameters; ## Direct attribute access (no get/set) sub new { return bless \$_[1], $_[0]; } sub plus1 { ++${ $_[ 0 ] } } package OO_2; ## Blessed scalar; ## Named parameters; ## Direct attribute access (no get/set) sub new { my( $class, $value ) = @_; return bless \$value, $class; } sub plus1 { my( $self ) = shift; ++$$self; } package OO_3; ## Blessed hash; ## Named parameters; ## Direct attribute access (no get/set) sub new { my( $class, $value ) = @_; my $self = { value => $value }; return bless $self, $class; } sub plus1 { my( $self ) = shift; ++$self->{ value }; } package OO_4; ## Blessed hash; ## Named parameters; ## lvalue get/setter sub new { my( $class, $value ) = @_; my $self = { value => $value }; return bless $self, $class; } sub value : lvalue{ my $self = shift; $self->{ value } } sub plus1 { my( $self ) = shift; $self->value()++; } package OO_5; ## Blessed hash; ## Named parameters; ## Separate Get & Set sub new { my( $class, $value ) = @_; my $self = { value => $value }; return bless $self, $class; } sub getValue { my $self = shift; $self->{ value } } sub setValue { my( $self, $newValue ) = @_; $self->{ value } = $newValue } sub plus1 { my( $self ) = shift; $self->setValue( $self->getValue() + 1 ); } package OO_6; ## Inherited blessed hash; ## Named parameters; ## Separate Get & Set; No overides use base 'OO_5'; package OO_7; ## Inside-Out hash; ## Named parameters; ## Separate Get & Set my %values; sub new { my( $class, $value ) = @_; my $self = bless \$value; $values{ $self } = $value; return $self; } sub getValue{ my $self = shift; $values{ $self } } sub setValue{ my( $self, $newValue ) = @_; $values{ $self } = $newValue; } sub plus1{ my $self = shift; $self->setValue( $self->getValue() + 1 ); } package OO_8; ## Inside-Out hash; ## Named parameters; ## Separate Get & Set; No overides. use base 'OO_7'; package OO_9; use Class::Std; ## Class::Std Inside Out hash; ## Named parameters; ## Separate Get & Set my %i :ATTR( :name ); sub plus1 { my $self = shift; $self->set_i( $self->get_i() + 1 ); } package OO_10; ## Inherited Class::Std Inside Out hash; ## Named parameters; ## Separate Get & Set; No overides; use base 'OO_9'; package main; use Benchmark qw[ cmpthese ]; our $MAX ||= 1e3; print "MAX: $MAX"; sub plus1{ $_[ 0 ]++ } sub plus1a{ my( $i ) = @_; ++$i } cmpthese 1, { inline => q[ my $i= 0; ++$i while $i < $MAX; print'inline:',$i;], sub1=> q[ my $i= 0; plus1( $i ) while $i < $MAX; print'sub1: ', $i;], sub2=> q[ my $i= 0; $i= plus1a($i ) while $i < $MAX; print'sub2: ', $i;], OO_1=> q[my $o= OO_1->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_1:', $i;], OO_2=> q[my $o= OO_2->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_2: ', $i;], OO_3=> q[my $o= OO_3->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_3: ', $i;], OO_4=> q[my $o= OO_4->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_4: ', $i;], OO_5=> q[my $o= OO_5->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_5: ', $i;], OO_6=> q[my $o= OO_6->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_6: ', $i;], OO_7=> q[my $o= OO_7->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_7: ', $i;], OO_8=> q[my $o= OO_8->new(0); my $i= 0; $i= $o->plus1() while $i < $MAX; print'OO_8: ', $i;], OO_9=> q[my $o= OO_9->new({ i => 0 }); my $i= 0; $i= $o->plus1() while $i < $MAX; print 'OO_9: ', $i; ], OO_10=>q[my $o= OO_10->new({ i => 0 }); my $i= 0; $i= $o->plus1() while $i < $MAX; print 'OO_10:', $i; ], }; cmpthese -1, { inline=>q[ my $i=0; ++$i while $i < $MAX; ], sub1=>q[ my $i=0; plus1( $i ) while $i < $MAX; ], sub2=>q[ my $i=0; $i= plus1a($i ) while $i < $MAX; ], OO_1=>q[ my $o= OO_1->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_2=>q[ my $o= OO_2->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_3=>q[ my $o= OO_3->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_4=>q[ my $o= OO_4->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_5=>q[ my $o= OO_5->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_6=>q[ my $o= OO_6->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_7=>q[ my $o= OO_7->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_8=>q[ my $o= OO_8->new(0); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_9=>q[ my $o= OO_9->new({ i => 0 }); my $i=0; $i= $o->plus1() while $i < $MAX; ], OO_10=> q[ my $o = OO_10->new( {i => 0}); my $i=0; $i= $o->plus1() while $i < $MAX; ], };