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倍くらいカッコいい。