Last active
December 15, 2015 01:39
-
-
Save kazuph/5181160 to your computer and use it in GitHub Desktop.
Moose vs Mouse vs Moo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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