我正在开发一个使用Perl的网络应用程序,我需要研究加速部分应用程序。
我以为我会开始分析我希望调查的部分的特定调用。我已经完成了一些关于分析Perl代码的搜索,但不幸的是,我发现的大部分内容都表明我应该从命令行运行带有-d:DProf myapp
的perl代码。这对我来说不太适用,因为我的代码在Web应用程序中。我确实找到了一种方法来使用apache进行分析,但不幸的是,从分析器返回的“最常用”模块都是CPAN模块--Class :: xyz等等。不是非常有用。
除了我将“计时器”代码注入我希望分析这些方法的方法之外,有没有人知道一个好方法?我曾经想过编写一个测试脚本并对其进行分析,但由于我正在研究的代码的性质,这需要比我希望做的更多的工作。
答案 0 :(得分:18)
您是否尝试过Devel::NYTProf(比Devel :: DProf好得多),它可以在Apache下运行?您使用的是哪个网络服务器?这是一个vanilla CGI脚本,mod_perl还是别的东西?
如果您正在处理数据库内容,DBI::Profile可以对您的查询进行基准测试,这是在另一个程序中发生的工作。
然而,真正的诀窍是组织代码,以便您可以进行全方位的测试和分析,而无需在最后将所有内容放在一起以发现某些内容很慢。在短期内,这对火灾没有多大帮助,但从长远来看,它确实可以防止火灾。还有各种方法来伪造Web服务器环境等等,但这是一个不同的问题。 :)答案 1 :(得分: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'
答案 2 :(得分:1)
如果您真的想在内部计时,可以将Benchmark核心模块与:hireswallclock 选项一起使用。但实际上,您应该能够从命令行进行配置。您可能必须编写测试脚本来模拟CGI请求的某些部分,但在查找性能瓶颈时,DProf可以极其有用。
特别是,查看代码调用CPAN模块代码的位置。您可能在循环中执行此操作远远超过必要,因此虽然花费在CPAN模块上的时间,但重构代码可以解决问题。
答案 3 :(得分:1)
我知道现在它有点晚了,但这是使用CGI::Application或其他架构的原因之一,其中Web应用程序只是面向Web的一小部分代码,它利用您编写的一堆模块来实现实际功能。使用这样的设计可以非常简单地从命令行中单独或集体地分析(或简单地测试)任何模块,而不必担心Web方面。