Javaによる高速化

IT

2022-02-15

Javaは速いのか遅いのか、IT業界ではよく話題になるし、私も一時期気になっていろいろ読んだけど、結論は「CやC++よりは遅いがPythonなんかよりはずっと速い」ということになるのだろう。

将棋ソフトになると、同じものをJavaとC++で組むと明らかにC++の方が速い。私は(私も)将棋ソフトの作り方を池泰弘さんの本で勉強したが、最初に手に取ったのが「Java将棋のアルゴリズム」だったので、まずはJavaでつくった。最初からC++でつくっていたらこんなことで悩まなかったと思う。

Javaも最近のはかなり速くなっているようだが、C++に比べると6割ぐらいの速さしかない。プログラマーの技量にもよるのだろうけど、個人的な技量でカバーしなければならないとしたら、それだけでもJavaはハンデだと思う。特に将棋は、局面の評価で機械学習でつくった重みを用いるので、計算力の差がものをいう。

C++は高速計算用のプログラム言語で、よくは知らないがたぶん昔のフォートランとかの系統に近いのだろう。だからGUIなんかはCやC++は貧弱だが、やっぱり計算力はずば抜けている。将棋の評価値でもパッと計算するのでやってて気持ちよくなる。画像処理でもメチャクチャ速いですね。

Javaは元々は家電製品を動かすプログラム言語だったそうだが、家電にそんなに高速計算はいらないだろう。それよりも新製品に応じて自在に作り変えていけることの方が大切で、それで「クラス」という概念を生み出して、保守管理に秀でたプログラム言語にしたんだろうと勝手に推測する。

しかしクラスはC++にもあるし、今やPythonでもC#でも何でもかんでもプログラム言語はクラスとメソッドというので、Javaの優位性は崩れているのだろう。それでも大規模システムにはJavaの需要は多いようで、Javaプログラマーの求人なんかやっぱり多いですねえ(私は縁がないけど)。

でもやっぱりAIになるとJavaは向かないでしょうね。VMとかメモリ管理をオートマにしてるとかそういうところでどうしても遅くなるのだろうけど、Javaのアーキテクチャなんかも複雑すぎて私にはわからないし。

AIの種類にもよるが、ビットボード一つにしてもJavaは64ビットまでしか使えないから、盤面をビット表現しようとすれば分割するしかない。これが四苦八苦で、つくってはみたがかえって遅くなる。池さんのように配列で合法手をつくった方が速くて、分割ビットボードだと7割ぐらいの速さですね。これも「個人的技量」で改善可能なのかもしれないが… 128ビットが使えないという時点で、C++とじゃ勝敗ありだと思う。

そうは言っても、AndroidはJavaかのKotlinだから、結局Javaを使わざるを得ない。XamarinでC#を使うという手もあるが、そこまで手が回りませんね。C#はCほど速くないし、C++で作り直すだけでもすごくかかったからなあ…

他のAndroidの将棋アプリは何でつくってるんだろう? Javaならたいしたものだし、私のもまだまだ改良の余地ありか。

まとめとしては、少なくとも将棋ソフトに関しては、何だかんだ言ってもCはすごいということです。本当にAI将棋が好きなら、スマホじゃなくて、プロ棋士たちのようにパソコンで将棋所とかを使うべきなんでしょう。