仕事でアプリのボトルネックを探しているという話をしたら、hideokiさんが

「YAPC::Asia 2010 で cho45 が紹介してた Devel::KYTProf がいいよー」

って言ってたので、使ってみたらだいぶよかったのでご紹介。

Devel::KYTProfの作者はid:onishiさんで、リポジトリはhttp://github.com/onishi/perl5-devel-kytprofにあります。

このモジュール、何ができるモジュールかっていうと(まぁcho45さんの発表動画見ればわかるのですが)、モジュール名とメソッド名を指定してやると、そのメソッドの処理にかかった時間をさくっと調べられるというものです。

たとえば Foo::Controller::Bar の baz() って関数の処理時間が知りたかったら、そのアプリケーションのメインモジュールに
use Devel::KYTProf;
Devel::KYTProf->add_prof( 'Foo::Controller::Bar', 'baz' );
って書くことで、STDERRに
123.456 ms [Foo::Controller::Bar] baz() | Devel::KYTProf:100
みたいな感じで処理時間とちょっとした情報が出力されます。よっぽどトリッキーなことしてるモジュールじゃない限り、これを使うことで処理時間を調べることができるはず。

あとadd_prof() は、第3引数を渡すことができて
Devel::KYTProf->add_prof(
    'Foo::Controller::Bar',
    'baz',
    sub {
        my ( $orig, $self ) = @_;
        return $self->foo_bar;
    }
);
とやると処理時間と共に$self->foo_bar の値がSTDERRに出力されます。

それ以外にも Devel::KYTProf->threshold( 100 ) とかやると、指定したものよりも処理時間がかかったもののみを出力するようにしたりと、いくつかのオプションが用意されています。

ちなみに Devel::KYTProf は、デフォルトでIO関係でよく問題になるようなDBI、LWP::UserAgent、Cache::Memcached::Fast、MogileFS::Clientなどのモジュールの設定が最初からされていたりします。それ以外にも調べたいという場合に上記の設定を自分でしたらよいという感じになっています。

なお今回、僕の場合はTTの[% foo %]の部分の速度が調べたかったので
Devel::KYTProf->add_prof(
    'Template::Stash::XS',
    'get',
    sub {        my ($orig, $self, $ident, $args) = @_;
        return ref $ident eq 'ARRAY' ? join(",", @$ident) : $ident;
    }
);
こんな感じにしてみました。
まぁ、結局問題はそこじゃなかったんですけどね...。

ということで、このDevel::KYTProfはかなりお手軽に細かい処理時間が調べられるので興味ある方は一度使ってみてはいかがでしょうか。