MooseとMouseが遅いのは最初だけなんです

昔Mouseで作ったコンテンツ管理ツールをリファクタリングしようと思いました。

記事にあたる部分をパッケージ化しておいて整合性チェックのために都度コンストラクトする仕組みなんですが、記事が増えてきたら時間がかかって

Mouseのままでもいいかなーと思ってますがMouse使わない場合は
どれぐらい速くなるかを調べてみました。

ソースコード

#!/usr/bin/env perl
use strict;
use warnings;
use FindBin qw($Bin);
use Path::Class qw/dir file/;
use Benchmark qw(:all);
use Data::Dumper;

my $data = {
    id => 'name',
    order => '001',
    title => 'title',
    keywords => [qw/some keywords here/],
    description => 'test test test',
    content => 'content content content',
};

cmpthese timethese 10_000, {
    'Mou' => sub {
        Mou->new($data);
    },
    'Moo' => sub {
        Moo->new($data);
    },
    'Plane' => sub {
        Plane->new($data);
    },
};

package Mou;
use Mouse;

has id          => ( is => 'ro', isa => 'Str' );
has order       => ( is => 'ro', isa => 'Str' );
has title       => ( is => 'ro', isa => 'Str' );
has keywords    => ( is => 'ro', isa => 'ArrayRef' );
has description => ( is => 'ro', isa => 'Maybe[Str]' );
has content     => ( is => 'ro', isa => 'Str' );

__PACKAGE__->meta->make_immutable;

no Mouse;

1;

package Moo;
use Moose;

has id          => ( is => 'ro', isa => 'Str' );
has order       => ( is => 'ro', isa => 'Str' );
has title       => ( is => 'ro', isa => 'Str' );
has keywords    => ( is => 'ro', isa => 'ArrayRef' );
has description => ( is => 'ro', isa => 'Maybe[Str]' );
has content     => ( is => 'ro', isa => 'Str' );

__PACKAGE__->meta->make_immutable;

no Moose;

1;

package Plane;
use strict;
use warnings;

sub new {
    my ($class, $data ) = @_;
    bless {
        id => $data->{id},
        order => $data->{order},
        title => $data->{title},
        keywords => $data->{keywords},
        description => $data->{description},
        content => $data->{content},
    }, $class;
}

1;

結果

:!perl bench/construct_mouse_vs_plane.pl
Benchmark: timing 10000 iterations of Moo, Mou, Plane...
       Moo:  3 wallclock secs ( 0.00 usr +  3.46 sys =  3.46 CPU) @ 2890.17/s (n=10000)
       Mou:  2 wallclock secs ( 0.00 usr +  1.89 sys =  1.89 CPU) @ 5291.01/s (n=10000)
     Plane:  0 wallclock secs ( 0.00 usr +  0.25 sys =  0.25 CPU) @ 40000.00/s (n=10000)
            (warning: too few iterations for a reliable count)
         Rate   Moo   Mou Plane
Moo    2890/s    --  -45%  -93%
Mou    5291/s   83%    --  -87%
Plane 40000/s 1284%  656%    --

何度もコンストラクションする仕組みだとMooseは適さない感じかも。

XMLやDBIxとか、Iteratorで処理するモジュールは内部にあるあるオブジェクト生成どうやってるか調べてみるか…


いや、やっぱり面倒だな。リファクタリングしないで新しいPC
買えばいいかw

※もちろん型チェックとかいろいろPlaneパッケージに実装してから比較すべきですが、もうそのあたりから面倒だという