我最近一直在玩 Jython,并决定用 pystone 做一些快速而肮脏的基准测试。为了获得参考,我首先测试了 cPython 2.6,循环次数越来越多(我认为这可能是相关的,因为 Jython 应该在一段时间后才开始从 JIT 中获利)。
(richard garibaldi):/usr/local/src/pybench% python ~/tmp/pystone.py
Pystone(1.1) time for 50000 passes = 1.04
This machine benchmarks at 48076.9 pystones/second
(richard garibaldi):/usr/local/src/pybench% python ~/tmp/pystone.py 500000
Pystone(1.1) time for 500000 passes = 10.33
This machine benchmarks at 48402.7 pystones/second
(richard garibaldi):/usr/local/src/pybench% python ~/tmp/pystone.py 1000000
Pystone(1.1) time for 1000000 passes = 19.6
This machine benchmarks at 51020.4 pystones/second
如您所见,cPython 的行为始终如一:完成测试所需的时间与循环次数成线性增加。知道了这一点,我开始测试 Jython。
(richard garibaldi):/usr/local/src/pybench% jython ~/tmp/pystone.py
Pystone(1.1) time for 50000 passes = 2.29807
This machine benchmarks at 21757.4 pystones/second
(richard garibaldi):/usr/local/src/pybench% jython ~/tmp/pystone.py 500000
Pystone(1.1) time for 500000 passes = 10.931
This machine benchmarks at 45741.4 pystones/second
(richard garibaldi):/usr/local/src/pybench% jython ~/tmp/pystone.py 1000000
Pystone(1.1) time for 1000000 passes = 107.183
This machine benchmarks at 9329.86 pystones/second
在第一次运行中,与它的 C 兄弟相比,Jython 运行得相当糟糕。当增加循环数时,它开始感觉更好,接近 cPython,就像我最初的假设所预测的那样。请注意,循环的数量增加了 10 倍,但 Jython 仅用了大约 5 倍的时间来完成它们。所以,正如你想象的那样,我期待 Jython 会在最终测试中真正发挥作用。然而,令我非常失望的是,它确实很糟糕:比最初的运行速度慢了两倍多。
您的假设是什么:为什么 Jython 的行为方式如此不一致?可能是 GC 在某个时刻开始了,并且花费了很多时间?我查看了 PyStone 的代码,垃圾收集似乎没有被关闭,但我希望 Java 的 GC 至少和 Python 的一样好......你认为这种减速是永久性的,还是会消失在增加循环次数后的某个时候?Jython 在真正长时间运行的进程中应如何表现?
编辑:不幸的是,java.lang.OutOfMemoryError
如果我将循环数增加到 200 万,我会得到......
(当然,Jython 仍处于测试阶段,因此在最终版本中应该会变得更好。)
我正在使用 Jython 2.5b1 (trunk:5903:5905, Jan 9 2009, 16:01:29), Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153) 和 Java HotSpot(TM) 64-Bit MacOS X 10.5 上的服务器 VM(内部版本 1.6.0_07-b06-57,混合模式)。
感谢您的回答。