gpt4 book ai didi

java - 为什么 Jython 在使用 PyStone 进行测试时表现不一致?

转载 作者:行者123 更新时间:2023-11-28 20:30:00 25 4
gpt4 key购买 nike

我最近一直在玩 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 在真正长时间运行的进程中应该如何表现?

编辑:不幸的是,如果我将循环数增加到 200 万次,我会得到 java.lang.OutOfMemoryError...

(当然,Jython 仍处于测试阶段,因此在最终版本中它应该会变得更好。)

我正在使用 Jython 2.5b1(trunk:5903:5905,2009 年 1 月 9 日,16:01:29)、Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153) 和 Java HotSpot(TM) MacOS X 10.5 上的 64 位服务器 VM(内部版本 1.6.0_07-b06-57,混合模式)。

感谢您的回答。

最佳答案

很难对像 JVM 这样复杂的运行时环境进行基准测试。即使不包括 JIT 和 GC,您在运行之间也会有很大的堆、内存布局和缓存变化。

对 Jython 有帮助的一件事是在单个 VM session 中多次运行基准测试:一次预热 JIT,一次或多次单独测量。我做了很多 Jython 基准测试,不幸的是,通常需要 10-50 次尝试才能达到合理的时间

您可以使用一些 JVM 标志来观察 GC 和 JIT 行为,以了解预热期应该有多长,但显然您不应该在启用调试标志的情况下进行基准测试。例如:

% ./jython -J-XX:+PrintCompilation -J-verbose:gc
1 java.lang.String::hashCode (60 bytes)
2 java.lang.String::charAt (33 bytes)
3 java.lang.String::lastIndexOf (156 bytes)
4 java.lang.String::indexOf (151 bytes)
[GC 1984K->286K(7616K), 0.0031513 secs]

如果您执行所有这些操作并使用 HotSpot Server VM,您会发现 Jython 在 pystone 上比 CPython 稍快一些,但这决不能代表 Jython 的一般性能。对于 2.5 版本,Jython 开发人员更加关注正确性而不是性能;在未来一年左右的时间里,随着 2.6/2.7/3.0 版本的发布,性能将得到更多强调。您可以通过查看一些 microbenchmarks 来了解一些痛点。 (最初源自 PyPy)我运行。

关于java - 为什么 Jython 在使用 PyStone 进行测试时表现不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com