2008-09-25 79 views
15

我正在研究一个使用Perl的Web应用程序,我需要研究加速部分应用程序。如何分析Perl Web应用程序?

我想我会开始分析我希望调查的部分的特定呼叫。我已经完成了一些关于分析Perl代码的搜索,但不幸的是,我发现大部分内容都说我应该从命令行运行我的Perl代码-d:DProf myapp。这对我来说并不适用,因为我的代码是在一个Web应用程序中。我确实找到了一种使用apache进行配置文件分析的方法,但不幸的是,从配置文件返回的“最常用”模块都是CPAN模块 - Class :: xyz等等等等。不是非常有帮助的。

有谁知道除了我注入“计时器”代码的方法,我想配置为只针对这些方法的方法吗?我想写一个测试脚本和分析,但由于我正在研究的代码的性质,需要比我希望做的更多的工作。

回答

18

你试过Devel::NYTProf(比Devel :: DProf好得多),它可以在Apache下工作吗?你使用哪个网络服务器?这是一个香草CGI脚本,一个mod_perl的东西,还是其他的东西?

如果你正在做数据库的东西,DBI::Profile可以基准查询,这是在另一个程序中发生的工作。

然而,真正的诀窍在于组织代码,以便您可以进行全面的测试和性能分析,而不必将所有内容放在一起以找出某些问题。这在短期内无法帮助你扑灭火灾,但从长远来看确实可以防止事情成为火灾。还有各种方法来伪造Web服务器环境等,但这是一个不同的问题。 :)

+0

是的,这是我尝试过的一个,所有它出现的是所有的cpan模块。我想实际针对这些具体的方法,并看看他们自己在大部分时间都花在哪里。 – Leanan 2008-09-26 02:58:35

1

如果您真的想在内部计时,可以使用Benchmark核心模块和:hireswallclock选项。但是,真的,你应该能够从命令行进行配置。您可能需要编写测试脚本来模拟CGI请求的某些部分,但在寻找性能瓶颈时,DProf可以是极其有用的

特别是,查找代码调用CPAN模块代码的位置。你可能在循环中做得太多,所以虽然时间花在CPAN模块上,但重构代码可以解决问题。

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'

1

我意识到这是一个有点太晚,在这一点上,但是这是为什么它是很好的使用CGI::Application原因或其他架构,其中的Web应用程序仅仅是网络的一个非常简短位单面向代码,它利用你编写的一堆模块来实现实际的功能。使用这样的设计使得从命令行简单(或简单地测试)任何模块非常简单,无论是单独还是集体,无需担心网络方面。