Performance 如何在非持久性CGI过程中提高Moose性能?

Performance 如何在非持久性CGI过程中提高Moose性能?,performance,perl,cgi,moose,Performance,Perl,Cgi,Moose,是一个奇妙的对象框架。问题是,加上它的依赖性,它非常大。我们的分析表明,在我们的平台上,简单地加载Moose将在非持久性CGI应用程序脚本上产生5-6秒的开销。这对于这些一次性应用来说是不可接受的 相比之下,当我们使用一个持久化进程系统(比如FCGI)时,这种启动开销就被消除了(或者说,只发生一次),而且一切都很好。我们所面临的问题是,我们不能保证所有代码总是在一个持久进程下运行 我们调查了将其作为一种功能有限的驼鹿替代品,但事实证明(如中所述),这不是一个可行的选择。我们为Moose编写的任何

是一个奇妙的对象框架。问题是,加上它的依赖性,它非常大。我们的分析表明,在我们的平台上,简单地加载Moose将在非持久性CGI应用程序脚本上产生5-6秒的开销。这对于这些一次性应用来说是不可接受的

相比之下,当我们使用一个持久化进程系统(比如FCGI)时,这种启动开销就被消除了(或者说,只发生一次),而且一切都很好。我们所面临的问题是,我们不能保证所有代码总是在一个持久进程下运行

我们调查了将其作为一种功能有限的驼鹿替代品,但事实证明(如中所述),这不是一个可行的选择。我们为Moose编写的任何库在微妙但重要的方面都无法与Mouse一起工作。我们真的不想把所有的模块都分叉,这样我们就可以支持持久化环境中的Moose和“普通”CGI中的鼠标

有鉴于此,我们有以下选择:

  • 根据需要,将我们的内部模块交给Moose或Mouse使用。(恶心!)
  • 仅为FCGI/Moose开发我们的模块。不再支持“香草”CGI。如果我们必须编写不持久的脚本,它们将无法利用我们的内部模块
  • 不要使用Moose或鼠标,而是使用其他对象框架

  • 哪种选择最好?我们现在倾向于2,如果我们必须让一些东西作为一个普通的CGI运行的话,我们会把它吸起来。其他框架呢?还有什么更轻的吗?

    还有另一个选择-


    我从来没用过,但它看起来确实很有趣。而编写它的人(Matt Sergeant aka baud)——它实际上为您提供了高质量代码的保证。

    我倾向于放弃一般的CGI支持。现在FCGI托管非常便宜,没有理由迎合香草CGI(IMO),因为它只是强化了Perl速度慢的观点。但如果你无法避免,那么你可以使用类似的方法。但是,如果您需要角色、约束、元编程以及Moose提供的所有其他功能,那么除非您放弃普通的CGI,否则您就没有运气了。

    您可以使用Moose编写一个后端服务器应用程序,然后编写查询后端的非常小、简单的CGI脚本

    +-------+    +--------------+
    | Small |===>|  Persistent  |
    |  CGI  |<===| Moose Server |
    +-------+  ^  +--------------+
               |
             Socket
           Connection
    
    +----++--------------+
    |小|==>|持久|
    
    |我的建议是使用选项2,然后帮助我们重构Moose,使CGI变得可行。fREW目前正在开发Moose测试套件,以支持MooseX::Antlers项目,该项目将减少大部分开销,这意味着Moose无法用于CGI环境


    马特·特劳特(Matt Trout,mst)是MooseX::Antlers公司的负责人,他表示希望在必要时能够在CGI环境中运行应用程序。我建议你现在还是和FCGI呆在一起,纠缠他你能做些什么来帮助他

    几个月前,乔纳森·罗克韦(Jonathan Rockway)曾写过(奇怪的是,它不在CPAN中)。我没有用过它,但根据他上面链接的博文,它看起来提供了一个相当透明的服务器-客户机体系结构,您可以将CGI的实际处理封装在其中,还有一些可能是,将Perl程序编译成字节码的过程只完成一次,之后的调用中会使用某种缓存。因为据说Moose在编译时会受到很大的影响,所以我会先尝试这种方法


    我在2001年左右成功地使用了
    perpl
    在一个古老的系统上绘制了大量的图形。Perl程序对每个图都执行,这相当大的开销——这可能与您的CGI场景相当。

    Perll是由Matt Sergeant(波特)而不是Matt Trout(mst)编写的。并不是说波特编写的代码质量比mst低。。。只是他们不是同一个人。如果这是一个错误,你为什么不修正你的答案呢?是的,你可以用这个。但是为什么不直接使用FastCGI或mod_perl呢?App::Persistent用于命令行应用程序。