AUTOLOAD。
ね、眠いけど、メモ。
今回のリファクタ案件、
AUTOLOAD の使い方に、非常に不満がありまして。
だって、何度も同じメソッド名で呼び出すのに
それが意図的に実装されてなくて、
毎度AUTOLOADを介して、別のクラスの同名メソッドを起動してるんだもん。
それも、呼び出されてるメソッドは、単なるゲッターなので
素直なルーチンにしたら、もっと高速になるんじゃなかろーか…と思い
テストしたのでした。
・A.pm(AUTOLOADを介してゲッターを呼び出すクラス)
package A;use Target;
sub new {
my $self = shift;
bless {
'_obj' => Target->new()
}, $self;
}
sub AUTOLOAD {
my $self = shift;
return if our $AUTOLOAD =~ /DESTROY/;
return $self->{'_obj'}->get(shift);
}
1;
・B.pm(素直にゲッターを呼び出すクラス)
package B;use Target;
sub new {
my $self = shift;
bless {
'_obj' => Target->new()
}, $self;
}
sub get {
my $self = shift;
my $name = shift;
return $self->{'_obj'}->get($name);
}
1;
・bench.pl
#!/usr/bin/perl -wuse strict;
use Benchmark qw(:all);
use lib qw(/home/anigon/autoload);
my $result = timethese(1000, {
'AUTOLOAD' => sub {
use A;
my $obj = A->new();
$obj->get('url');
},
'direct' => sub {
use B;
my $obj = B->new();
$obj->get('url');
}
});
cmpthese($result);
exit;
結果
・・・だよね、やっぱり。Benchmark: timing 1000 iterations of AUTOLOAD, direct...
AUTOLOAD: 0 wallclock secs ( 0.10 usr + 0.00 sys = 0.10 CPU) @ 10000.00/s (n=1000)
(warning: too few iterations for a reliable count)
direct: 0 wallclock secs ( 0.05 usr + 0.00 sys = 0.05 CPU) @ 20000.00/s (n=1000)
(warning: too few iterations for a reliable count)
Rate AUTOLOAD direct
AUTOLOAD 10000/s -- -50%
direct 20000/s 100% --
当然ですよね…orz
うーん、なんでこんな事したのか、全く気持ちが理解出来ないなぁ…。