我最近下载了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建议穆斯类
Sin*_*nür 12
我听说穆斯很慢,这是真的吗?
再一次,这个很棘手,所以是和否.
首先,生活中没有任何东西是免费的,而且一些Moose特征比其他特征花费更多.Moose的政策也只是向您收取您使用的功能,并尽最大努力不为您未使用的功能执行代码带来任何额外负担.当然使用Moose本身确实需要一些开销,但主要是编译时间.在这一点上,我们有一些选项可用于获得您所需的速度.
目前,我们提供了使您的类不可变的选项,以提高速度.这将意味着稍高的编译时间成本,但运行时速度的增加(特别是在对象构造中)非常重要.这可以使用以下代码完成:
Run Code Online (Sandbox Code Playgroud)MyClass->meta->make_immutable();我们经常将Class :: MOP的热点转换为XS.Florian Ragwitz和Yuval Kogman目前正致力于将您的访问者和实例直接编译到C中,这样每个人都可以享受超快速的OO.
另一方面,我正在使用Dancer和Moose的Web应用程序.由于应用程序作为HTTPD守护程序运行,因此一旦初始化服务器,这些都不是真正相关的.对于我在有限的硬件或虚拟服务器上的要求,性能似乎已经足够了.
使用Moose和Dancer进行这个项目有一个额外的好处,我的小型演示应用程序从大约5,000行缩减到少于1,000行.
你希望你的应用程序依赖多少东西是你必须考虑的权衡之一.通过限制依赖性,CGI应用程序的响应速度更快.
你的问题有点欺骗性.是的,Moose有可观的启动成本,但在此之后并不慢.如果启动成本过高,您可以始终对应用程序进行守护.