Class::Insideout
なるCPANモジュールがあるそうで。
同じInsideout実装のClass::Stdとのベンチをとってみる。
#!/usr/bin/perl package MyClass; use Class::Std; { my %name : ATTR( :get<name> :set<name> :init_arg<name>); my %age : ATTR( :get<age> :set<age> :init_arg<age>); my %height : ATTR( :get<height> :set<height> :init_arg<height>); } package MyClass2; use Class::InsideOut qw( public register ); public name => my %name; public age => my %age; public height => my %height; sub new{ register(shift) } package Main; use strict; use warnings; use Benchmark; my $name="hoge"; my $age=18; my $height=165; sub std { my $a = MyClass->new({ name=>"okuhara", age=>27, height=>173, }); $a->get_name(); $a->get_age(); $a->get_height(); $a->set_name($name); $a->set_age($age); $a->set_height($height); } sub insideout { my $a = MyClass2->new({ name=>"okuhara", age=>27, height=>173, }); $a->name(); $a->age(); $a->height(); $a->name($name); $a->age($age); $a->height($height); } timethese( 5000,{ 'std'=>\&std, 'ins'=>\&insideout, });
で、結果。
ins: 1 wallclock secs ( 0.41 usr + 0.00 sys = 0.41 CPU) @ 12195.12/s (n=5000) std: 2 wallclock secs ( 0.73 usr + 0.01 sys = 0.74 CPU) @ 6756.76/s (n=5000)
2〜3年前のibookG4でやりました。
Class::Insideoutの方が2倍くらい速い。
環境によっては気にならないくらい差が縮まった。
でもClass::Stdのの方が遅め。
でも、Class::Stdで書いた方が3倍くらいカッコいい。