在计算机语言基准游戏中提高Perl的chameneos-redux的速度

时间:2010-04-09 16:18:56

标签: perl optimization

曾经看过Computer Language Benchmarks Game(以前称为大语言枪战)?

Perl目前在那里有一些相当健康的比赛。在我看来,可能还有一些地方可以改善Perl的分数。最大的一个是现在的chameneos-redux脚本 - Perl版本运行最糟糕的任何语言:比C基线解决方案慢1,626倍!

关于如何制作和优化程序有some restrictions,并且有Perl的解释运行时惩罚,但是1,626次?必须有一些东西可以让这个程序的运行时间缩短。

看看source codethe challenge,如何提高速度?

4 个答案:

答案 0 :(得分:6)

我通过source code分析器运行了Devel::SmallProf。配置文件输出有点过于冗长,无法在此处发布,但您可以使用$ perl -d:SmallProf chameneos.pl 10000自己查看结果(除非您确实需要,否则无需为6000000次会议运行!)有关详细信息,请参阅perlperf关于Perl中的一些分析工具。

事实证明,使用semaphores是主要的瓶颈。占用总CPU时间的大部分用于检查信号量是否被锁定。虽然我没有足够的时间来查看源代码使用信号量的原因,但可能是因为您可以完全使用信号量。这可能是你提高代码性能的最好机会。

答案 1 :(得分:2)

正如Zaid所说,Thread :: Semaphore相当慢。一种优化可能是对共享变量使用隐式锁而不是它们。它应该更快,但我怀疑它不会更快。

通常,Perl的线程实现很糟糕,需要进行大量的线程间通信。它非常适合没有通信的任务(与CPython的线程和CRuby的线程不同,它们实际上是先发制人的。)

有可能改善这种情况,我们需要更好的原语。

答案 2 :(得分:2)

我有一个基于Jesse Millikian的另一个版本的version,我认为该版本从未发布过。

我认为它可能比当前条目快〜7倍,并且使用标准模块。我不确定它是否真的符合所有规则。

我已经尝试了forks模块,但我认为它会减慢它的速度。

答案 3 :(得分:1)

在Perl条目上有人试过s / threads / forks /吗?或者Coro / Coro::MP,虽然后者可能会触发'有趣的替代实施'条款。