麋真的这么慢吗?

11 perl moose

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

no Moose;
Run Code Online (Sandbox Code Playgroud)

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

Eth*_*her 20

是的,使用Moose会有一点点惩罚.但是,它只是一个启动惩罚,而不是在运行时; 如果你正确地写了一切,那么在运行时事情就会非常快.

你还包括这一行:

__PACKAGE__->meta->make_immutable;
Run Code Online (Sandbox Code Playgroud)

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

但是,有时这个成本仍然太高.如果您使用驼鹿一个脚本中,或在编译时间是你的整体使用时间显著分数一些其他的方式,尝试做s/Moose/Moo/g-如果你不使用MooseX模块,您可以很可能切换到,其目标是更快(在启动时),同时保留Moose 90%的灵活性.

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

1 从make_immutable,在穆斯::食谱::基础:: Recipe7的文档
2又见小斯蒂文的文章:为什么make_immutable建议穆斯类

  • 实际上,Mouse的最初目标是教Sartak如何编写元协议.其次是低位的穆斯,没有所有"元"开销.Sartak然后发现"Meta"是Moose的强大部分并继续前进,其他人选择了Mouse. (7认同)
  • 有时快得多.很少有理由*不*让你的课程不可变(这是你应该只知道原因,并了解其缺点和后果的那些事情之一.) (3认同)
  • `$ time perl -Moose -E'has qw/foo isa Int是rw /; __PACKAGE __-> meta-> make_immutable if @ARGV; 推送@_,Class-> new为1..100_000; 打印标量@_'`,然后运行相同的东西只需附加一个`1`作为参数.你可以'使用Benchmark(.pm)`,但有时它甚至不是很接近. (2认同)
  • 以太:鼠标的目标是提供更快的启动时间,而不是"更快".辅助(相关!)目标是具有较少的依赖性. (2认同)
  • 错误,make_immutable将使AIUI使启动*更慢*不会更快. (2认同)

Sin*_*nür 12

Moose :: Cookbook :: FAQ:

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

再一次,这个很棘手,所以是和否.

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

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

MyClass->meta->make_immutable();
Run Code Online (Sandbox Code Playgroud)

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

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

使用Moose和Dancer进行这个项目有一个额外的好处,我的小型演示应用程序从大约5,000行缩减到少于1,000行.

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


yst*_*sth 6

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

  • @Kinopiko,ysth认为术语"慢"很难调用"编译时间"成本......你不会说KDE 4很慢,因为编译需要9个小时.并且,你不会说Linux因为运行init脚本的时间而变慢......我不同意ysth,我只是在解释我认为他的论点. (8认同)
  • 你再说一遍:"驼鹿很慢"......*你*知道你的意思是启动时间,但除非你澄清,否则其他人不会. (5认同)
  • 为什么它具有欺骗性?我不知道Moose直到昨天才这么慢,我对此感到非常惊讶. (2认同)
  • 但是我实际上并不是说启动时间。我的整个程序大约需要0.02秒才能运行完成(即完成其工作并退出)。因此0.25秒很多。 (2认同)
  • @Kinopiko - 你还在谈论启动时间(编译时间),这个类比仍然适用:编译KDE需要9个小时,即使你只是想要使用Konsole并找出内核版本,但是没有KDE很慢......虽然你在这里争论说*KDE很慢*并且如果你想要的只是在全新安装*上获得内核版本,那么它是有效的,除了没有真正有很多东西做得慢,无论如何它几乎不是KDE的正常用例. (2认同)