当前位置:  开发笔记 > 编程语言 > 正文

在使用mod_perl时,如何仅在编译时执行低效代码?

如何解决《在使用mod_perl时,如何仅在编译时执行低效代码?》经验,为你挑选了1个好方法。

我一直在对我在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块中,只有配置文件的路径不同.我有一些不同的策略来限制这个,但我只是想发布这个变化的结果.



1> ysth..:

假设您的应用程序根本不更改配置,请将其移至开始块:

# this code goes at file scope
my $config;
BEGIN {
    $config = { Config::General->new( ... )->getall }
}

# when creating a new instance
$self->config( $config );

并确保所有模块都在startup.pl中编译.

你可以得到更好的,并有一个单例类提供配置哈希,但你不需要.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有