Skip to content

Instantly share code, notes, and snippets.

@ytnobody
Last active August 29, 2015 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ytnobody/89a25e26aa42674fc782 to your computer and use it in GitHub Desktop.
Save ytnobody/89a25e26aa42674fc782 to your computer and use it in GitHub Desktop.
benchmark for instantiate that using / not using class generators
use strict;
use Benchmark qw/:all/;
use Data::Dumper;
### Mouse
{
package
MyClass::Mouse;
use Mouse;
has name => ( isa => 'Str', is => 'ro' );
has age => ( isa => 'Int', is => 'rw' );
no Mouse;
};
### POPO
{
package
MyClass::POPO;
sub new {
my ($class, %params) = @_;
bless {%params}, $class;
}
sub age {
my ($class, $val) = @_;
return $class->{age} unless $val;
$class->{age} = $val;
}
sub name {
my $class = shift;
$class->{name};
}
};
### Class::Accessor::Lite
{
package
MyClass::CAL;
use Class::Accessor::Lite (
new => 1,
ro => [qw/name/],
rw => [qw/age/],
);
};
### Class::Accessor::Fast;
{
package
MyClass::CAF;
use parent 'Class::Accessor::Fast';
__PACKAGE__->mk_accessors(qw/name age/);
};
my $mouse = MyClass::Mouse->new(age => 33, name => 'ytnobody');
my $popo = MyClass::POPO->new(age => 33, name => 'ytnobody');
my $cal = MyClass::CAL->new(age => 33, name => 'ytnobody');
my $caf = MyClass::CAF->new({age => 33, name => 'ytnobody'});
print Dumper $_ for ($mouse, $popo, $cal, $caf);
printf "Running on perl-%s\n", $];
printf "## Modules \n";
for my $class (qw/Mouse Class::Accessor::Lite Class::Accessor::Fast/) {
no strict;
printf " * %s VERSION %s\n", $class, ${$class.'::VERSION'} ;
}
printf "\n## instantiate\n";
cmpthese( 1000000, {
'Mouse' => sub { MyClass::Mouse->new(age => 33, name => 'ytnobody') },
'POPO' => sub { MyClass::POPO->new(age => 33, name => 'ytnobody') },
'CAL' => sub { MyClass::CAL->new(age => 33, name => 'ytnobody') },
'CAF' => sub { MyClass::CAF->new({age => 33, name => 'ytnobody'}) },
});
printf "\n## get attribute value\n";
cmpthese( 5000000, {
'Mouse' => sub { my $name = $mouse->name },
'POPO' => sub { my $name = $popo->name },
'CAL' => sub { my $name = $cal->name },
'CAF' => sub { my $name = $caf->name },
});
printf "\n## set attribute value\n";
cmpthese( 5000000, {
'Mouse' => sub { $mouse->age(34) },
'POPO' => sub { $popo->age(34) },
'CAL' => sub { $cal->age(34) },
'CAF' => sub { $caf->age(34) },
});
@ytnobody
Copy link
Author

~$ perl ./instantiate.pl 
$VAR1 = bless( {
                 'name' => 'ytnobody',
                 'age' => 33
               }, 'MyClass::Mouse' );
$VAR1 = bless( {
                 'age' => 33,
                 'name' => 'ytnobody'
               }, 'MyClass::POPO' );
$VAR1 = bless( {
                 'name' => 'ytnobody',
                 'age' => 33
               }, 'MyClass::CAL' );
$VAR1 = bless( {
                 'name' => 'ytnobody',
                 'age' => 33
               }, 'MyClass::CAF' );
Running on perl-5.018002
## Modules 
 * Mouse VERSION 2.3.0
 * Class::Accessor::Lite VERSION 0.06
 * Class::Accessor::Fast VERSION 0.34

## instantiate
           Rate   CAF Mouse  POPO   CAL
CAF    581395/s    --  -12%  -18%  -46%
Mouse  662252/s   14%    --   -7%  -38%
POPO   709220/s   22%    7%    --  -34%
CAL   1075269/s   85%   62%   52%    --

## get attribute value
           Rate   CAL   CAF  POPO Mouse
CAL   2136752/s    --   -8%  -14%  -68%
CAF   2325581/s    9%    --   -7%  -66%
POPO  2487562/s   16%    7%    --  -63%
Mouse 6756757/s  216%  191%  172%    --

## set attribute value
           Rate   CAF   CAL  POPO Mouse
CAF   2857143/s    --   -2%   -5%  -55%
CAL   2906977/s    2%    --   -3%  -54%
POPO  3012048/s    5%    4%    --  -52%
Mouse 6329114/s  122%  118%  110%    --

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment