ぜんぜん調べてないのでもうあるのかもしれないし、
なんかPerlの流儀に沿ってないかもしれないんですけれど、
PythonにあってPerlにないものっていえばってことで。
package MyApp::Util::Decorator; use strict; use warnings; use Sub::Decorator; use Time::HiRes qw/gettimeofday tv_interval/; use parent qw/Sub::Decorator/; sub stopwatch { my ($self, $sub, @args) = @_; my $begin = gettimeofday(); my @result = &$sub(@args); my $elapsed= tv_interval($begin, gettimeofday()); warn $self->func_name.': '.$elapsed.' sec'; return @result; } 1;
use strict; use warnings; use 5.012; use MyApp::Util::Decorator; sub hogehoge :Decorator('stopwatch') { #do something } hogehoge(); # hogehoge: 0.xxx sec
みたいな。まあデコレータですね。
この場合は関数の実行にかかった秒数とか測っていますけれど、副作用のない関数であれば関数名と引数をキーにして結果をキャッシュしておけば、早くなるかもねという話も。
そんな感じです。