我最近下载了 Moose。作为实验,我重写了 Moose 中的一个现有模块。这似乎是避免编写大量重复代码的便捷方法。我运行了模块的测试,我注意到它有点延迟。我用 -d:DProf 分析了代码,似乎只包括该行
no Moose;
代码中的运行时间增加了大约 0.25 秒(在我的电脑上)。这是典型的吗?我是不是做错了什么,是我安装错了,还是我们真的应该期待这么多延迟?
是的,使用 Moose 会受到一些惩罚。但是,这只是启动惩罚,而不是运行时;如果您正确编写了所有内容,那么运行时的速度会非常快。
您是否还包括此行:
__PACKAGE__->meta->make_immutable;
在你所有的课上你什么时候no Moose;
?调用此方法将使其(运行时)更快(以启动时间为代价)。特别是,对象构造和销毁在您的类中有效地“内联”,不再调用元 API。强烈建议您使您的类不可变。它使您的代码更快,编译时间成本很小。这在创建许多对象时尤其明显。1
2
但是,有时这个成本还是太大了。如果您在脚本中使用 Moose,或者以其他方式使用编译时间占总使用时间的很大一部分,请尝试这样做s/Moose/Moo/g
——如果您不使用 MooseX 模块,您可能会切换到Moo,其目标是更快(在启动时),同时保留 Moose 90% 的灵活性。
由于您正在使用 Web 应用程序,您是否考虑过使用 Plack/PSGI?
1来自 make_immutable 的文档,在 Moose::Cookbook::Basics::Recipe7
2另见 Stevan Little 的文章:为什么建议 Moose 类使用 make_immutable
我听说Moose很慢,这是真的吗?
同样,这个很棘手,所以是和否。
首先,生活中没有什么是免费的,Moose 的某些功能确实比其他功能成本更高。Moose 的政策也是仅对您使用的功能收费,并尽我们最大的努力不为您不使用的功能的代码执行增加任何额外负担。当然,使用 Moose 本身确实会产生一些开销,但主要是编译时间。在这一点上,我们确实有一些选项可用于获得您需要的速度。
目前,我们提供了使您的类不可变的选项,以作为提高速度的一种手段。这将意味着编译时间成本稍高,但运行时速度的提高(尤其是在对象构造中)非常显着。这可以通过以下代码完成:
MyClass->meta->make_immutable();
我们定期将 Class::MOP 的热点转换为 XS。Florian Ragwitz 和 Yuval Kogman 目前正在研究一种将您的访问器和实例直接编译成 C 语言的方法,以便每个人都可以享受极快的 OO。
另一方面,我正在开发一个使用Dancer和Moose的网络应用程序。因为应用程序作为 HTTPD 守护程序运行,所以一旦服务器初始化,这些都不是真正相关的。性能似乎足以满足我对有限硬件或虚拟服务器的要求。
在这个项目中使用 Moose 和 Dancer 的另一个好处是,我的小型演示应用程序从大约 5,000 行缩减到了不到 1,000 行。
您希望您的应用程序依赖多少东西是您必须考虑的权衡之一。通过限制依赖关系,CGI 应用程序的响应速度更快。
你的问题有点欺骗性。是的,Moose 有一个可衡量的启动成本,但在那之后并不慢。如果启动成本过高,您可以随时守护您的应用程序。