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パッケージに実装してから比較すべきですが、もうそのあたりから面倒だという