我一直在对我在Perl中编写的框架的性能进行基准测试,并且我的每秒请求数比现有代码库减少了50%(一些命中率是可以理解的,因为我们将从程序意义上的代码转换为OOP MVC框架).
应用程序在mod_perl下运行,我已将Moose和我的所有框架代码添加到startup.pl脚本中,该脚本本身使我的请求每秒加倍.我希望进一步增强这个数字,使其尽可能接近现有数量.我们认为这是过早的优化,但是我想解决一些明显的低效问题,看看它如何影响性能.
像大多数框架一样,我有一个配置文件和一个调度程序.配置部分由Config :: General处理,因此需要一些IO和解析来将我的配置文件加载到应用程序中.我在这里看到的最大问题是我正在为每一个请求进行此操作!
在我的应用程序上运行Devel :: Dprof指向Config :: General :: BEGIN和一堆相关的IO模块作为不是Moose的主要慢点之一.所以我想要做的事情,以及事后更有意义的是利用mod_perl的持久性和startup.pl编译的东西,只做一次加载配置文件的工作 - 当服务器启动时.
问题是我不太熟悉它是如何工作的.
目前每个项目都有一个非常精简的PerlHandler引导类,如下所示:
use MyApp; MyApp->new(config_file => '/path/to/site.config')->run();
MyApp.pm继承自框架Project模块,该模块具有以下代码:
my $config = Config::General->new( -ConfigFile => $self->config_file, -InterPolateVars => 1, ); $self->config({$config->getall});
要仅在编译时执行此操作,我的引导程序和项目基础模块都必须更改(我认为),但我不确定要进行哪些更改并仍然保持代码良好和精益.任何人都能指出我在正确的方向吗?
UPDATE
我在每个项目模块方法中尝试了BEGIN BLOCK,如ysth在他的回答中所描述的那样.所以我现在有:
package MyApp::bootstrap; use MyApp; my $config; BEGIN { $config = {Config::General->new(...)->getall}; } sub handler { ..etc. MyApp->new(config => $config)->run();
这个快速变化让我每秒的请求增加了50%,证实了我的想法,配置文件是一个值得修复的主要瓶颈.我们的crotchety旧开发机器上的基准数字是60rps,我的框架已经从30rps变为45rps单独进行此更改.对于那些说Moose很慢并且编译时间很短的人来说......在启动时编译我所有的Moose代码时我得到了相同的(50%)增加,就像我预先编译我的配置文件一样.
我现在唯一的问题是这违反了DRY主体,因为相同的Config :: General->新代码在每个BEGIN块中,只有配置文件的路径不同.我有一些不同的策略来限制这个,但我只是想发布这个变化的结果.
假设您的应用程序根本不更改配置,请将其移至开始块:
# this code goes at file scope my $config; BEGIN { $config = { Config::General->new( ... )->getall } } # when creating a new instance $self->config( $config );
并确保所有模块都在startup.pl中编译.
你可以得到更好的,并有一个单例类提供配置哈希,但你不需要.