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に提案した方がいいんだろうな。
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment