Ich habe kürzlich mit Jython gespielt und beschlossen, einige schnelle und schmutzige Benchmarking mit pystone zu tun. Um eine Referenz zu haben, habe ich zuerst cPython 2.6 getestet, mit einer zunehmenden Anzahl von Schleifen (ich dachte, dies könnte relevant sein, da Jython erst nach einiger Zeit von der JIT profitieren sollte).
(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
Wie Sie sehen, verhält sich cPython konsistent: Die Zeit, die für die Durchführung des Tests benötigt wird, steigt linear mit der Anzahl der Schleifen. Mit diesem Wissen begann ich, Jython zu testen.
(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
Beim ersten Durchlauf läuft Jython im Vergleich zu seinem C-Bruder eher lausig. Als ich die Anzahl der Schleifen erhöhte, begann es sich besser zu fühlen und näherte sich cPython an, wie meine anfängliche Hypothese voraussagte. Man beachte, dass die Anzahl der Schleifen um das 10-fache anstieg, Jython aber nur etwa 5 mal länger brauchte, um sie abzuschließen. Wie Sie sich vorstellen können, hatte ich also erwartet, dass Jython im Abschlusstest richtig abräumen würde. Zu meiner großen Enttäuschung schnitt es jedoch wirklich schlecht ab: mehr als doppelt so langsam wie im ersten Durchgang.
Was sind Ihre Hypothesen: Warum verhält sich Jython so inkonsistent? Könnte es sein, dass GC zu einem bestimmten Zeitpunkt einsetzt und eine Menge Zeit benötigt? Ich habe mir den Code von PyStone angesehen und die Garbage Collection scheint nicht ausgeschaltet zu sein, aber ich würde erwarten, dass die GC von Java mindestens so gut ist wie die von Python... Glauben Sie, dass diese Verlangsamung dauerhaft ist, oder wird sie irgendwann verschwinden, wenn man die Anzahl der Schleifen erhöht? Wie soll sich Jython in einem wirklich langen Prozess verhalten?
EDIT: Leider erhalte ich java.lang.OutOfMemoryError
wenn ich die Anzahl der Schleifen auf 2 Millionen erhöhe...
(Natürlich ist Jython noch im Beta-Stadium, so dass es in der endgültigen Version besser werden sollte).
Ich verwende Jython 2.5b1 (trunk:5903:5905, Jan 9 2009, 16:01:29), Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153) und Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_07-b06-57, mixed mode) auf MacOS X 10.5.
Vielen Dank für Ihre Antworten.