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% --
別にそんな事は無かった。