Javaはできる子です

Javaと聞くと、遅くね?と拒否反応を示す人は多いはず。就職して以降、弊社の戦略的事情から(本当だろうか)もっぱらプログラムはJavaで書いています。Javaは適当に遊んでいた程度でしたが、だいぶ慣れてきました。チューニング的な意味で。最近、大規模データや構造化データを扱うことが増えたので、ちょっと気を抜くと動かなくなります。同じインターフェースで5回くらい実装し直すのはざらです。

さて、Javaインタプリタだから遅いと思われがちですが、本当でしょうか。最近の経験を鑑みるに、JIT最適化はかなりがんばっているという印象を受けます。経験的に(CPU実験の)、もっとも効く最適化の一つはインライン展開(とそれに伴う定数伝搬など)なんですが、そちらは実はだいぶがんばっているように思います。遅い原因は、そこではなくてメモリ馬鹿食いから来るキャッシュミスと、それに伴う速度低下が原因の用に思います。Javaは仕様上(たしか)オブジェクトやら配列やら、何を作るにも余計にメモリを食います。Arrayなんて最悪にメモリ食うので、絶対にvectorに勝てません。可変長配列を自作することをお勧めします。HashMapもひどいことになるので、byte[]を作って2分探索をお勧めします。しかし、一方でJITでしかできない最適化もあるので、それを検証。テーマは仮想関数。

続きを読む