Devel::NYTProfでプロファイリング

http-engineをNYTProfを使ってプロファイリングしてみました。

HTTP::Engineの実行用のスクリプト

tools/profile.pl

use strict;
use warnings;
use HTTP::Engine;
use IO::Scalar;

my $engine = HTTP::Engine->new(
    interface => {
        module          => 'CGI',
        args            => { port => 9999, },
        request_handler => sub {
            my $c = shift;
            $c->res->status(200);
        },
    }   
);

$ENV{REMOTE_ADDR}    = '127.0.0.1';
$ENV{REQUEST_METHOD} = 'GET';
$ENV{SERVER_PORT}    = 80; 

tie *STDOUT, 'IO::Scalar', \my $out;
$engine->run;
untie *STDOUT;

上記perlスクリプトでプロファイルするスクリプト

tools/profile.sh

#!/bin/sh
rm -rf nytprof
rm nytprof.out
perl -d:NYTProf -S ./tools/profile.pl .
nytprofhtml
open ./nytprof/index.html

これでprofilingして、結果のhtmlを開くところまでやってくれます。

メソッドの中のどの箇所にどれだけ時間がかかっているのかというのがわかるのはなかなかいいですね。ソースコードの脇にプロファイリング結果が表示されるのがかなりいいです。これはチューニングするときにかなり使えそうでね。

Devel::NYTProf::Apacheというモジュールもあるので、mod_perl applicationのprofilingにも使えそうです。

# tokuhiromさんがhttp-engineのtoolsディレクトリに入れているcoverage_test.shはいいなぁと思っていて、nytprofのスクリプトを作っていれてみました。