Perl Webアプリのプロファイルを作成するにはどうすればよいですか?
質問
Perlを使用するWebアプリで作業していますが、アプリの一部の高速化を検討する必要があります。
調査したい部分の特定の呼び出しのプロファイリングを開始すると思いました。 Perlコードのプロファイリングをいくつか検索しましたが、残念ながら、ほとんどの場合、コマンドラインから -d:DProf myapp
を使用してperlコードを実行する必要があります。私のコードはWebアプリ内にあるので、それは私にはまったく機能しません。私はプロファイリングをApacheで動作させる方法を見つけましたが、残念ながら「最も使用されている」ものはプロファイラーから戻ってきたモジュールはすべてCPANモジュールでした-Class :: xyzなどなど。ひどく役に立たなかった。
「タイマー」を注入する以外に、誰かが良い方法を知っていますか?これらのメソッドのみをターゲットにするためにプロファイルしたいメソッドにコードを追加しますか?私はテストスクリプトを記述してプロファイリングすることを考えましたが、私が取り組んでいるコードの性質のために、私がやろうとしているよりも少し多くの作業が必要になります。
解決
Devel :: NYTProf (Devel :: DProfよりはるかに優れています) )、Apacheの下で動作することができますか?どのWebサーバーを使用していますか?これはバニラCGIスクリプト、mod_perlのもの、または他の何かですか?
データベース関連の作業をしている場合、 DBI :: Profile は別のプログラムで行われている作業であるクエリのベンチマークを実行します。
しかし、本当のトリックは、遅いものを見つけるために最後にすべてをまとめることなくテストとプロファイリングの全範囲を実行できるようにコードを編成することです。短期的には火災と戦うのにあまり役立ちませんが、長期的には物事が火災になるのを防ぎます。ウェブサーバー環境などを偽造するさまざまな方法もありますが、それは別の質問です。 :)
他のヒント
CGI.pmを使用している場合、コマンドラインでperlスクリプトに引数を渡すことができ、CGI.pmはそれらをHTTP経由でパラメータとして渡されたものとして解釈します。デバッグしている場合、たとえば
http://example.com/scripts/example.pl?action=browse& ; search = grommet& restrict = blah
その後、コマンドラインから呼び出すことができます。例:
perl -d:NYTProf documentroot /scripts/example.pl 'action = browse& search = grommet& restrict = blah'
Benchmark コアモジュールを< strong>:hireswallclock オプションは、内部で時間を計測したい場合に使用します。しかし、実際には、コマンドラインからプロファイルできる必要があります。 CGIリクエストの特定の部分をエミュレートするためにテストスクリプトを作成する必要があるかもしれませんが、パフォーマンスのボトルネックを探す場合、DProfは非常に役立ちます。
特に、コードがCPANモジュールコードを呼び出している場所を探します。必要以上にループでこれを行っている可能性があるため、CPANモジュールで時間を費やしている間に、コードをリファクタリングすることで問題を解決できます。
この時点では少し遅れていると思いますが、これが CGI :: Application または、Webアプリが実際の機能を実装するために作成した多数のモジュールを使用する非常に短いWebに面したコードである別のアーキテクチャ。このような設計を使用すると、Webの側面を心配することなく、コマンドラインからモジュールを個別にまたは集合的にプロファイリング(または単にテスト)することが非常に簡単になります。