SPECjvm98

そういえば、SPECjvm98のベンチマークプログラムの.classファイルって付属の.javaファイルをコンパイルして生成したものかと思いきや、実は微妙に違っていたりするのがタチが悪い。.javaファイルだけを見て最適化手法を考えているとハマったりする。

例えば compress のソースでは htab.of(i) という式でテーブルのi番目の要素にアクセスすることが多い。of()の実体は

public int of(int i) {
      return tab[i];
}

なのでJITコンパイラがインライン展開すれば速くなる……と思いきや、対応する.classの中身のバイトコードを眺めると既にインライン展開されていたりする。少なくともSunのjavacはこんな最適化はしないはずなので他のjavaコンパイラを使ったか、もしくはこの.classは別の.javaから生成されたか、だ。まず間違いなく後者だと思われる。

昔、IBM東京基礎研のインライン展開についての論文を読んでいてmtrtは速くなっているのにcompressはそれほどでもなかったのが不思議だったが、真相はこんなところだろう。