だるろぐ

だるいぶろぐです

AUTOLOADって遅いんじゃね?と思ったけど

use strict;
use warnings;
use Benchmark qw/:all/;

our $AUTOLOAD;

foo();
bar();

cmpthese(
    timethese(0, {
        normal   => sub { normal() },
        autoload => sub { autoload() },
    })
);

sub call_foo { -foo }
sub call_bar { -bar }

sub normal {
    call_foo() eq -foo or die;
    call_bar() eq -bar or die;
}

sub cache_autoload {
    my $value = shift;
    my $name = (split(/::/, $value))[-1];
    no strict "refs";
    *{"main::$name"} = sub { "-$name" };
    "-$name";
}

sub AUTOLOAD {
    cache_autoload($AUTOLOAD);
}

sub autoload {
    foo() eq -foo or die;
    bar() eq -bar or die;
}
% perl t.pl
Benchmark: running autoload, normal for at least 3 CPU seconds...
  autoload:  4 wallclock secs ( 3.25 usr +  0.00 sys =  3.25 CPU) @ 521055.38/s (n=1693430)
    normal:  4 wallclock secs ( 3.24 usr +  0.01 sys =  3.25 CPU) @ 480974.46/s (n=1563167)
             Rate   normal autoload
normal   480974/s       --      -8%
autoload 521055/s       8%       --

別にそんな事は無かった。