私は最近 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 が最終テストで本当にうまくいくことを期待していました。しかし、非常に残念なことに、最初の実行よりも 2 倍以上遅くなりました。
あなたの仮説は何ですか: Jython がこれほど一貫性のない動作をするのはなぜですか? ある時点で GC が開始され、多くの時間がかかっている可能性がありますか? PyStone のコードを調べたところ、ガベージ コレクションがオフになっていないように見えますが、Java の GC は少なくとも Python と同じくらい優れていると思います...この速度低下は永続的だと思いますか、それともなくなると思いますか?ループ数を増やした後のある時点で?Jython は、非常に長時間実行されるプロセスでどのように動作しますか?
EDIT:残念ながら、java.lang.OutOfMemoryError
ループ数を200万に増やすと...
(もちろん、Jython はまだベータ版なので、最終リリースでは改善されるはずです。)
Jython 2.5b1 (トランク:5903:5905、2009 年 1 月 9 日、16:01:29)、Java(TM) SE ランタイム環境 (ビルド 1.6.0_07-b06-153)、および Java HotSpot(TM) 64 ビットを使用しています。 MacOS X 10.5 上のサーバー VM (ビルド 1.6.0_07-b06-57、混合モード)。
回答ありがとうございます。