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;