frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

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 -w

use 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

うーん、なんでこんな事したのか、全く気持ちが理解出来ないなぁ…。