代码之家  ›  专栏  ›  技术社区  ›  user181548

驼鹿真的这么慢吗?

  •  11
  • user181548  · 技术社区  · 15 年前

    我最近下载了驼鹿。在实验上,我重写了驼鹿中现有的模块。这似乎是避免编写大量重复代码的方便方法。我运行了模块的测试,发现有点延迟。我用-d:dprof对代码进行了分析,似乎只包括行

    no Moose;
    

    在代码中,运行时间增加了大约0.25秒(在我的计算机上)。这是典型的吗?是我做错了什么,是我装错了,还是我们真的应该期待这么多的延迟?

    3 回复  |  直到 10 年前
        1
  •  20
  •   Ether    10 年前

    是的,使用驼鹿会受到一些惩罚。但是,这只是一个启动惩罚,而不是在运行时;如果您编写的一切都正确,那么在运行时事情将非常迅速。

    您是否还包括以下行:

    __PACKAGE__->meta->make_immutable;
    

    在你所有的课上当你 no Moose; ?调用此方法将使它(运行时)更快(以牺牲启动时间为代价)。特别是,对象构造和破坏在类中是有效的“内联”的,不再调用元API。强烈建议您使类不可变。它使您的代码更快,编译时成本很低。这在创建许多对象时尤其明显。

    然而,有时这种成本仍然太高。 如果您在脚本中使用moose,或者以其他方式使用编译时间占总使用时间的很大一部分,请尝试这样做。 s/Moose/Moo/g --如果你不使用moosex模块,你可能会切换到 Moo 其目标是更快(启动时),同时保持驼鹿90%的灵活性。

    由于您使用的是Web应用程序,您是否考虑过使用plack/psgi?

    From the docs of make_immutable, in Moose::Cookbook::Basics::Recipe7
    另见Stevan Little的文章: Why make_immutable is recommended for Moose classes

        2
  •  12
  •   Sinan Ünür    14 年前

    Moose::Cookbook::FAQ :

    我听说驼鹿很慢,是真的吗?

    再说一次,这是一个棘手的问题,所以是和否。

    首先,生活中没有什么是免费的,一些驼鹿的特征确实比其他特征更昂贵。Moose的政策也是只对您使用的功能收费,并且尽我们最大的努力,不要为您不使用的功能在代码的执行上增加任何额外的负担。当然,使用moose本身也会带来一些开销,但这主要是编译时间。现在,我们有一些方法可以让您达到所需的速度。

    目前,我们提供了使类不可变的选项,以提高速度。这意味着编译时间成本稍高,但运行时速度的提高(特别是在对象构造中)非常显著。这可以通过以下代码完成:

    MyClass->meta->make_immutable();
    

    我们定期将class::mop的热点转换为xs。FlorianRagwitz和YuvalKogman目前正在研究一种将访问器和实例直接编译为C的方法,这样每个人都可以享受到快速OO的乐趣。

    另一方面,我正在开发一个使用 Dancer Moose . 因为应用程序是作为httpd守护进程运行的,所以一旦服务器初始化,这些都不是真正相关的。性能似乎比我在有限的硬件或虚拟服务器上的需求更合适。

    在这个项目中使用驼鹿和舞者有一个额外的好处,那就是我的小型演示应用程序从大约5000行缩减到不到1000行。

    你希望你的应用程序依赖多少东西是你必须考虑的权衡之一。通过限制依赖关系,CGI应用程序的响应速度更快。

        3
  •  6
  •   ysth    15 年前

    你的问题有点欺骗性。是的,驼鹿有一个可测量的启动成本,但在那之后并不慢。如果启动成本过高,则可以始终对应用程序进行后台监控。