Saturday, 20 January 2007

せこい最適化が裏目に出る話



昨日の日立のJava compilerの話です。Java には、整数はオブジェクトでないので、変わりにInteger というクラス(Wrapperとかいう)を作るというのが良くある。なんだが、そいつが、
  static Integer cache[];
  ...
  if (-128<v && v< 128) {
    return cache[v];
  else
    return new Integer(v);
みたいなことをしているわけ。ライブラリの中でね。

これが原因で、Wrapper 生成がnullを返さないというのをコンパイラが判定できなくなってしまう。ってな話。

良く使うオブジェクトは取って再利用しようって話なので、一見、もっともらしい最適化なんだよね。これがライブラリの中にあるので取り除けない。なので、ここだけコンパイラの中で決め打ちするってな話でした。

この方法だと、Wrapper オブジェクトが色んなところから共有されてしまうので、reference count をさぼれなくなるので、その分も遅くなってしまう。Java みたいなreference count base GC を持っている言語では、この手の再利用はしてはいけないことらしいです。がんがん作って、さっさと使い捨てた方が良いそうです。

プログラムの記述は、コンパイラに対するヒントでしかないみたいなところもあるので、素直に記述した方がいいってなことなんでしょうけどね。

これはライブラリの欠陥なので、Sunに提案した方がいいんだろうな。

No comments: