Я недавно играл с 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
Во время первого запуска Jython работает довольно вяло по сравнению со своим братом C. Когда число циклов увеличилось, он начал чувствовать себя лучше, приближаясь к cPython, как и предсказывала моя первоначальная гипотеза. Обратите внимание, что количество циклов увеличилось в 10 раз, но Jython потребовалось всего лишь в 5 раз больше времени для их завершения. Итак, как вы представляете, я ожидал, что Jython действительно будет потрясающим в финальном тесте. Однако, к моему большому разочарованию, все получилось очень плохо: более чем в два раза медленнее, чем при первом запуске.
Каковы ваши гипотезы: почему Jython ведет себя таким противоречивым образом? Может ли быть так, что GC включается в какой-то момент и отнимает много времени? Я посмотрел на код PyStone, и сборка мусора, кажется, не отключена, но я ожидаю, что GC Java будет, по крайней мере, таким же хорошим, как Python ... Как вы думаете, это замедление является постоянным, или оно исчезнет? в какой-то момент после увеличения числа петель? Как должен вести себя Jython в действительно длительных процессах?
РЕДАКТИРОВАТЬ: к сожалению, я получаю java.lang.OutOfMemoryError
, если я увеличу количество циклов до 2 миллионов ...
(Конечно, Jython по-прежнему является бета-версией, поэтому в финальной версии он должен стать лучше.)
Я использую Jython 2.5b1 (транк: 5903: 5905, 9 января 2009, 16:01:29), среду выполнения Java (TM) SE (сборка 1.6.0_07-b06-153) и Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 1.6.0_07-b06-57, смешанный режим) на MacOS X 10.5.
Спасибо за ваши ответы.