麋真的这么慢吗?

时间:2010-07-01 23:30:06

标签: perl moose

我最近下载了Moose。在实验上,我重写了Moose中的现有模块。这似乎是避免编写大量重复代码的便捷方法。我运行了模块的测试,我注意到它有点延迟了。我用-d:DProf描述了代码,似乎只包括行

no Moose;
代码中的

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

3 个答案:

答案 0 :(得分:20)

是的,使用Moose会受到一些惩罚。但是,它只是一个启动惩罚,而不是在运行时;如果你正确地编写了所有内容,那么在运行时事情就会非常快。

您是否也包含此行:

__PACKAGE__->meta->make_immutable;
no Moose;时所有课程中的

?调用此方法将使其(运行时)更快(以启动时为代价)。特别是,对象构造和销毁在您的类中被有效地“内联”,并且不再调用元API。强烈建议您使类不可变。它使您的代码更快,编译时成本很低。在创建许多对象时,这一点尤其明显。 1 2

然而,有时这个成本仍然太高。 如果您在脚本中使用Moose,或者在编译时间占整个使用时间的很大一部分时使用Moose,请尝试执行s/Moose/Moo/g - 如果您不使用MooseX模块,则很可能切换到Moo,其目标是更快(在启动时),同时保留Moose 90%的灵活性。

由于您正在使用Web应用程序,您是否考虑过使用Plack / PSGI?

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

答案 1 :(得分:12)

请参阅Moose::Cookbook::FAQ

  

我听说穆斯很慢,这是真的吗?

     

同样,这个很棘手,所以是和否。

     

首先,生活中没有任何东西是免费的,而且一些驼鹿特征比其他特征花费更多。 Moose的政策也只是向您收取您使用的功能,并尽最大努力不为您未使用的功能执行代码带来任何额外负担。当然使用Moose本身确实需要一些开销,但主要是编译时间。在这一点上,我们有一些选项可用于获得所需的速度。

     

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

MyClass->meta->make_immutable();
     

我们经常将Class :: MOP的热点转换为XS。 Florian Ragwitz和Yuval Kogman目前正致力于将您的访问者和实例直接编译到C中,这样每个人都可以享受快速的OO。

另一方面,我正在开发一个使用DancerMoose的网络应用程序。由于应用程序作为HTTPD守护程序运行,因此一旦初始化服务器,这些都不是真正相关的。对于我在有限的硬件或虚拟服务器上的要求,性能似乎已经足够了。

在这个项目中使用Moose和Dancer还有一个额外的好处,就是我的小型演示应用程序从大约5,000行减少到不到1,000行。

您希望应用依赖多少内容是您必须考虑的权衡之一。通过限制依赖性,CGI应用程序的响应速度更快。

答案 2 :(得分:6)

你的问题有点欺骗性。是的,Moose有可观的启动成本,但在此之后并不慢。如果启动成本过高,您可以始终对应用程序进行守护。