P:\test>467452 -N=1 Rate OO5 OO4 OO3 OO2 OO1 subs OO5 18408/s -- -56% -69% -76% -83% -91% OO4 41813/s 127% -- -29% -45% -60% -79% OO3 58681/s 219% 40% -- -23% -44% -71% OO2 76466/s 315% 83% 30% -- -27% -62% OO1 105426/s 473% 152% 80% 38% -- -48% subs 203292/s 1004% 386% 246% 166% 93% -- P:\test>467452 -N=100 Rate OO5 OO4 OO3 OO2 OO1 subs OO5 1886/s -- -7% -27% -29% -68% -69% OO4 2023/s 7% -- -21% -24% -66% -67% OO3 2568/s 36% 27% -- -3% -56% -58% OO2 2652/s 41% 31% 3% -- -55% -57% OO1 5886/s 212% 191% 129% 122% -- -4% subs 6100/s 223% 202% 138% 130% 4% -- P:\test>467452 -N=10000 Rate OO4 OO5 OO2 OO3 OO1 subs OO4 14.5/s -- -1% -26% -27% -68% -69% OO5 14.6/s 1% -- -26% -27% -68% -69% OO2 19.7/s 36% 35% -- -1% -56% -58% OO3 19.9/s 37% 36% 1% -- -56% -57% OO1 45.2/s 211% 209% 129% 127% -- -3% subs 46.8/s 222% 219% 138% 135% 4% -- P:\test>467452 -N=100000 Rate OO4 OO5 OO2 OO3 OO1 subs OO4 1.42/s -- -1% -25% -26% -68% -68% OO5 1.44/s 1% -- -24% -25% -67% -67% OO2 1.89/s 34% 32% -- -1% -57% -57% OO3 1.92/s 36% 34% 2% -- -56% -56% OO1 4.39/s 210% 206% 132% 129% -- -0% subs 4.41/s 212% 207% 133% 130% 0% -- #### #! perl -slw use strict; use Benchmark qw[ cmpthese ]; use Dummy1; use Dummy2; use Dummy3; use Dummy4; use Dummy5; use Dummy6; our $N ||= 100; our @data = 1 .. $N; cmpthese -3, { subs=> q[ my @modified = sumem( reversem( @data ) ); ], OO1 => q[ my $obj = new Dummy2; my @modified = $obj->sumem( $obj->reversem( @data ) ); ], OO2 => q[ my $obj = new Dummy3( @data ); $obj->reversem; my @modified = $obj->sumem; ], OO3 => q[ my $obj = new Dummy4( @data ); $obj->reversem; my @modified = $obj->sumem; ], OO4 => q[ my $obj = new Dummy5( @data ); $obj->reversem; my @modified = $obj->sumem; ], OO5 => q[ my $obj = new Dummy6( @data ); $obj->reversem; my @modified = $obj->sumem; ], }; #### use strict; package Dummy1; our @ISA = 'Exporter'; our @EXPORT = qw[ sumem reversem ]; sub sumem { my $sum += $_ for @_; return $sum; } sub reversem { return map{ scalar reverse } @_; } 1; #### #! perl -slw use strict; package Dummy2; sub new { my $class = shift; return bless [], $class; } sub sumem { my $self = shift; my $sum += $_ for @_; return $sum; } sub reversem { my $self = shift; return map{ scalar reverse } @_; } 1; #### #! perl -slw use strict; package Dummy3; sub new { my $class = shift; return bless [ @_ ], $class; } sub sumem { my $self = shift; my $sum += $_ for @{ $self }; return $sum; } sub reversem { my $self = shift; @{ $self } = map{ scalar reverse } @{ $self }; } 1; #### #! perl -slw use strict; package Dummy4; sub new { my $class = shift; return bless { data => \@_ }, $class; } sub sumem { my $self = shift; my $sum += $_ for @{ $self->{ data } }; return $sum; } sub reversem { my $self = shift; @{ $self->{ data } } = map{ scalar reverse } @{ $self->{ data } }; } 1; #### #! perl -slw use strict; package Dummy5; sub new { my $class = shift; my $self = bless {}, $class; $self->_setData( @_ ); return $self; } sub _getData { my $self = shift; return @{ $self->{ data } }; } sub _setData { my $self = shift; return @{ $self->{ data } } = @_; } sub sumem { my $self = shift; my $sum += $_ for $self->_getData(); return $sum; } sub reversem { my $self = shift; $self->_setData( map{ scalar reverse } $self->_getData() ); } 1; #### #! perl -slw use strict; package Dummy6; my %dummies; sub new { my $class = shift; my $self = bless {}, $class; $dummies{ $self } = {}; $self->_setData( @_ ); return $self; } sub _getData { my $self = $dummies{ +shift }; return @{ $self->{ data } }; } sub _setData { my $self = $dummies{ +shift }; return @{ $self->{ data } } = @_; } sub sumem { my $self = shift; my $sum += $_ for $self->_getData(); return $sum; } sub reversem { my $self = shift; $self->_setData( map{ scalar reverse } $self->_getData() ); } 1;