Skip to content

Instantly share code, notes, and snippets.

@kazuph
Last active December 15, 2015 01:39
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 kazuph/5181160 to your computer and use it in GitHub Desktop.
Save kazuph/5181160 to your computer and use it in GitHub Desktop.
Moose vs Mouse vs Moo
#!/usr/bin/env perl
# package ClassBless;
# # 原始的なPerlの書き方
# use strict;
# use warnings;
# use utf8;
# use Data::Dump qw/dump/;
# sub new {
# my $class = shift;
# my %args = @_;
# my $self = bless {
# rw1 => $args{rw1},
# rw2 => $args{rw2},
# rw3 => $args{rw3},
# rw4 => $args{rw4},
# rw5 => $args{rw5},
# rw6 => $args{rw6},
# }, $class;
# return $self;
# }
#
# package ClassCAF;
# use strict;
# use warnings;
# use base qw(Class::Accessor::Fast);
# __PACKAGE__->mk_accessors(qw/rw1 rw2 rw3 rw4 rw5 rw6/);
#
# package ClassCAL;
# use strict;
# use warnings;
# use Class::Accessor::Lite(
# # new => 1,
# ro => [qw(ro1 ro2 ro3 ro4 ro5 ro6)],
# rw => [qw(rw1 rw2 rw3 rw4 rw5 rw6)],
# );
# Class::Accessor::Lite->mk_new();
package ClassMoose;
use Moose;
has 'ro1' => ( is => 'ro', isa => 'Bool', default => 1 );
has 'ro2' => ( is => 'ro', isa => 'Int', default => 1 );
has 'ro3' => ( is => 'ro', isa => 'Str' , default => '1' );
has 'ro4' => ( is => 'ro', isa => 'ArrayRef' , default => sub { [] });
has 'ro5' => ( is => 'ro', isa => 'HashRef' , default => sub { {} });
has 'ro6' => ( is => 'ro', isa => 'CodeRef' , default => sub { sub {1} });
has 'rw1' => ( is => 'rw', isa => 'Bool', default => 1 );
has 'rw2' => ( is => 'rw', isa => 'Int', default => 1 );
has 'rw3' => ( is => 'rw', isa => 'Str' , default => '1' );
has 'rw4' => ( is => 'rw', isa => 'ArrayRef' , default => sub { [] });
has 'rw5' => ( is => 'rw', isa => 'HashRef' , default => sub { {} });
has 'rw6' => ( is => 'rw', isa => 'CodeRef' , default => sub { sub {1} });
__PACKAGE__->meta->make_immutable;
no Moose;
1;
package ClassMouse;
use Mouse;
has 'ro1' => ( is => 'ro', isa => 'Bool', default => 1 );
has 'ro2' => ( is => 'ro', isa => 'Int', default => 1 );
has 'ro3' => ( is => 'ro', isa => 'Str' , default => '1' );
has 'ro4' => ( is => 'ro', isa => 'ArrayRef' , default => sub { [] });
has 'ro5' => ( is => 'ro', isa => 'HashRef' , default => sub { {} });
has 'ro6' => ( is => 'ro', isa => 'CodeRef' , default => sub { sub {1} });
has 'rw1' => ( is => 'rw', isa => 'Bool', default => 1 );
has 'rw2' => ( is => 'rw', isa => 'Int', default => 1 );
has 'rw3' => ( is => 'rw', isa => 'Str' , default => '1' );
has 'rw4' => ( is => 'rw', isa => 'ArrayRef' , default => sub { [] });
has 'rw5' => ( is => 'rw', isa => 'HashRef' , default => sub { {} });
has 'rw6' => ( is => 'rw', isa => 'CodeRef' , default => sub { sub {1} });
__PACKAGE__->meta->make_immutable;
no Mouse;
1;
package ClassMoo;
use Moo;
use MooX::Types::MooseLike::Base qw(:all);
has 'ro1' => ( is => 'ro', isa => Bool, default => 1 );
has 'ro2' => ( is => 'ro', isa => Int, default => 1 );
has 'ro3' => ( is => 'ro', isa => Str , default => '1' );
has 'ro4' => ( is => 'ro', isa => ArrayRef , default => sub { [] });
has 'ro5' => ( is => 'ro', isa => HashRef , default => sub { {} });
has 'ro6' => ( is => 'ro', isa => CodeRef , default => sub { sub {1} });
has 'rw1' => ( is => 'rw', isa => Bool, default => 1 );
has 'rw2' => ( is => 'rw', isa => Int, default => 1 );
has 'rw3' => ( is => 'rw', isa => Str , default => '1' );
has 'rw4' => ( is => 'rw', isa => ArrayRef , default => sub { [] });
has 'rw5' => ( is => 'rw', isa => HashRef , default => sub { {} });
has 'rw6' => ( is => 'rw', isa => CodeRef , default => sub { sub {1} });
__PACKAGE__->meta->make_immutable;
1;
package main;
use strict;
use warnings;
use Benchmark ':all';
# my $bless = ClassBless->new;
# my $caf = ClassCAF->new;
# my $cal = ClassCAL->new;
my $moose = ClassMoose->new;
my $mouse = ClassMouse->new;
my $moo = ClassMoo->new;
no warnings 'void';
cmpthese(timethese(300000, {
moose_ro => sub {
$moose->ro1;
$moose->ro2;
$moose->ro3;
$moose->ro4;
$moose->ro5;
$moose->ro6;
},
moose_rw => sub {
$moose->rw1;
$moose->rw2;
$moose->rw3;
$moose->rw4;
$moose->rw5;
$moose->rw6;
},
moose_direct => sub {
$moose->{'rw1'};
$moose->{'rw2'};
$moose->{'rw3'};
$moose->{'rw4'};
$moose->{'rw5'};
$moose->{'rw6'};
},
mouse_ro => sub {
$mouse->ro1;
$mouse->ro2;
$mouse->ro3;
$mouse->ro4;
$mouse->ro5;
$mouse->ro6;
},
mouse_rw => sub {
$mouse->rw1;
$mouse->rw2;
$mouse->rw3;
$mouse->rw4;
$mouse->rw5;
$mouse->rw6;
},
mouse_direct => sub {
$mouse->{'rw1'};
$mouse->{'rw2'};
$mouse->{'rw3'};
$mouse->{'rw4'};
$mouse->{'rw5'};
$mouse->{'rw6'};
},
moo_ro => sub {
$moo->ro1;
$moo->ro2;
$moo->ro3;
$moo->ro4;
$moo->ro5;
$moo->ro6;
},
moo_rw => sub {
$moo->rw1;
$moo->rw2;
$moo->rw3;
$moo->rw4;
$moo->rw5;
$moo->rw6;
},
moo_direct => sub {
$moo->{'rw1'};
$moo->{'rw2'};
$moo->{'rw3'};
$moo->{'rw4'};
$moo->{'rw5'};
$moo->{'rw6'};
},
# caf_rw => sub {
# $caf->rw1;
# $caf->rw2;
# $caf->rw3;
# $caf->rw4;
# $caf->rw5;
# $caf->rw6;
# },
# caf_direct => sub {
# $caf->{'rw1'};
# $caf->{'rw2'};
# $caf->{'rw3'};
# $caf->{'rw4'};
# $caf->{'rw5'};
# $caf->{'rw6'};
# },
# cal_ro => sub {
# $cal->ro1;
# $cal->ro2;
# $cal->ro3;
# $cal->ro4;
# $cal->ro5;
# $cal->ro6;
# },
# cal_rw => sub {
# $cal->rw1;
# $cal->rw2;
# $cal->rw3;
# $cal->rw4;
# $cal->rw5;
# $cal->rw6;
# },
# cal_direct => sub {
# $cal->{'rw1'};
# $cal->{'rw2'};
# $cal->{'rw3'};
# $cal->{'rw4'};
# $cal->{'rw5'};
# $cal->{'rw6'};
# },
# bless_rw => sub {
# $bless->{'rw1'};
# $bless->{'rw2'};
# $bless->{'rw3'};
# $bless->{'rw4'};
# $bless->{'rw5'};
# $bless->{'rw6'};
# },
}));
__END__
Benchmark: timing 300000 iterations of moo_direct, moo_ro, moo_rw, moose_direct, moose_ro, moose_rw, mouse_direct, mouse_ro, mouse_rw...
moo_direct: 0 wallclock secs ( 0.10 usr + 0.00 sys = 0.10 CPU) @ 3000000.00/s (n=300000)
(warning: too few iterations for a reliable count)
moo_ro: 1 wallclock secs ( 0.62 usr + 0.00 sys = 0.62 CPU) @ 483870.97/s (n=300000)
moo_rw: 1 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 517241.38/s (n=300000)
moose_direct: 0 wallclock secs ( 0.10 usr + 0.00 sys = 0.10 CPU) @ 3000000.00/s (n=300000)
(warning: too few iterations for a reliable count)
moose_ro: 1 wallclock secs ( 0.68 usr + 0.00 sys = 0.68 CPU) @ 441176.47/s (n=300000)
moose_rw: 1 wallclock secs ( 0.70 usr + 0.00 sys = 0.70 CPU) @ 428571.43/s (n=300000)
mouse_direct: 0 wallclock secs ( 0.10 usr + 0.00 sys = 0.10 CPU) @ 3000000.00/s (n=300000)
(warning: too few iterations for a reliable count)
mouse_ro: 0 wallclock secs ( 0.21 usr + 0.00 sys = 0.21 CPU) @ 1428571.43/s (n=300000)
(warning: too few iterations for a reliable count)
mouse_rw: 0 wallclock secs ( 0.19 usr + 0.00 sys = 0.19 CPU) @ 1578947.37/s (n=300000)
(warning: too few iterations for a reliable count)
Rate moose_rw moose_ro moo_ro moo_rw mouse_ro mouse_rw mouse_direct moose_direct moo_direct
moose_rw 428571/s -- -3% -11% -17% -70% -73% -86% -86% -86%
moose_ro 441176/s 3% -- -9% -15% -69% -72% -85% -85% -85%
moo_ro 483871/s 13% 10% -- -6% -66% -69% -84% -84% -84%
moo_rw 517241/s 21% 17% 7% -- -64% -67% -83% -83% -83%
mouse_ro 1428571/s 233% 224% 195% 176% -- -10% -52% -52% -52%
mouse_rw 1578947/s 268% 258% 226% 205% 11% -- -47% -47% -47%
mouse_direct 3000000/s 600% 580% 520% 480% 110% 90% -- 0% -0%
moose_direct 3000000/s 600% 580% 520% 480% 110% 90% 0% -- -0%
moo_direct 3000000/s 600% 580% 520% 480% 110% 90% 0% 0% --
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment