16

Perl を使用する Web アプリに取り組んでおり、アプリの一部の高速化を検討する必要があります。

調査したい部分の特定の呼び出しのプロファイリングを開始すると思いました。-d:DProf myappPerl コードのプロファイリングについていくつか検索しましたが、残念ながら、見つかったもののほとんどは、コマンド ラインからPerl コードを実行する必要があると述べています。私のコードは Web アプリ内にあるため、これはうまくいきません。プロファイリングをApacheで動作させる方法を見つけましたが、残念ながら、プロファイラーから返された「最も使用された」モジュールはすべてCPANモジュールでした.Class::xyzなど.

プロファイリングしたいメソッドに「タイマー」コードを挿入して、これらのメソッドだけをターゲットにする以外に、良い方法を知っている人はいますか? テスト スクリプトを作成してプロファイリングすることも考えましたが、現在取り組んでいるコードの性質上、思った以上に多くの作業が必要になります。

4

4 に答える 4

19

Apache で動作するDevel::NYTProf (Devel::DProf よりもはるかに優れています)を試しましたか? どのウェブサーバーを使用していますか? これはバニラの CGI スクリプトですか、mod_perl のものですか、それとも何か他のものですか?

データベース関連の作業を行っている場合、DBI::Profileはクエリのベンチマークを実行できます。これは別のプログラムで行われている作業です。

ただし、本当の秘訣は、コードを整理して、最後にすべてをまとめて遅いものを見つけなくても、テストとプロファイリングの全範囲を実行できるようにすることです。これは、短期的には火災と戦うのにあまり役立ちませんが、長期的には物事が火災になるのを防ぎます. Webサーバー環境などを偽装する方法もいろいろありますが、それは別問題です。:)

于 2008-09-25T21:07:57.937 に答える
10

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'

于 2008-09-25T21:50:23.780 に答える
1

この時点で少し遅れていることは承知していますが、これがCGI::Applicationや、Web アプリが Web 向けの非常に短いコードである別のアーキテクチャを使用するのが良い理由の 1 つです。実際の機能を実装するために作成したモジュールの束。このような設計を使用すると、Web の側面を気にすることなく、コマンド ラインから任意のモジュールを個別にまたはまとめてプロファイル (または単にテスト) することが非常に簡単になります。

于 2008-09-26T01:52:40.267 に答える
1

内部で時間を計測したい場合は、 Benchmarkコア モジュールを:hireswallclockオプションで使用できます。しかし実際には、コマンド ラインからプロファイリングできるはずです。CGI 要求の特定の部分をエミュレートするためにテスト スクリプトを作成する必要がある場合もありますが、パフォーマンスのボトルネックを探す場合 は DProf が非常に役立ちます。

特に、コードが CPAN モジュール コードを呼び出している場所を探します。これを必要以上にループで実行している可能性があるため、CPAN モジュールで時間が費やされている間に、コードをリファクタリングすることで問題を解決できます。

于 2008-09-25T21:01:50.637 に答える