16

我正在开发一个使用 Perl 的网络应用程序,我需要研究加速应用程序的某些部分。

我想我会开始分析我希望调查的部分的特定调用。我已经对分析 Perl 代码进行了一些搜索,但不幸的是,我发现的大部分内容都表明我应该从命令行运行我的 perl 代码-d:DProf myapp。这对我来说不太适用,因为我的代码位于 Web 应用程序中。我确实找到了一种让分析与 apache 一起工作的方法,但不幸的是,从分析器返回的“最常用”模块都是 CPAN 模块——Class::xyz 等等等等。没有太大帮助。

除了我将“计时器”代码注入我希望分析的方法以仅针对这些方法之外,还有没有人知道一个好方法?我曾想过编写一个测试脚本并对其进行分析,但由于我正在处理的代码的性质,这需要比我希望做的更多的工作。

4

4 回答 4

19

您是否尝试过可以在 Apache 下工作的Devel::NYTProf(比 Devel::DProf 好得多)?您使用的是哪个网络服务器?这是一个普通的 CGI 脚本,一个 mod_perl 的东西,还是别的什么?

如果你在做数据库的事情,DBI::Profile可以对你的查询进行基准测试,这是在另一个程序中进行的工作。

然而,真正的诀窍是组织代码,以便您可以进行全方位的测试和分析,而不必在最后将它们放在一起以发现某些东西很慢。这在短期内对灭火没有多大帮助,但从长远来看,它确实可以防止事情变成火灾。还有各种方法可以伪造网络服务器环境等等,但这是一个不同的问题。:)

于 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

如果您真的想在内部计时,可以使用带有:hireswallclock选项的Benchmark核心模块。但实际上,您应该能够从命令行进行分析。您可能必须编写测试脚本来模拟 CGI 请求的某些部分,但 DProf在寻找性能瓶颈时 非常有用。

特别是,查找您的代码调用 CPAN 模块代码的位置。您可能在循环中执行此操作的次数远远超过必要的次数,因此当花费在 CPAN 模块上的时间时,重构您的代码可以解决问题。

于 2008-09-25T21:01:50.637 回答
1

我意识到此时它有点晚了,但这就是为什么使用CGI::Application或其他架构很好的原因之一,在这种架构中,Web 应用程序只是一小段面向 Web 的代码,它可以利用您为实现实际功能而编写的一堆模块。使用这样的设计可以非常简单地从命令行单独或集体地分析(或简单地测试)任何模块,而不必担心 Web 方面。

于 2008-09-26T01:52:40.267 回答