数字のキャッシュ、続編。
とりあえず実装してみた。
BigIntegerCacheとBigDecimalCache。
Sunのクラスと、ほぼ同じ作りだが、BigDecimalCacheはBigIntegerCacheの依存させている。メソッドは基本的にvalueOfのみ。
キャッシュを考える時、それがヒープを抑えるためのキャッシュか、速度を速くするためのキャッシュかの違いを意識する必要がある。
僕が今回目指してるのは速度を速くするキャッシュで、ヒープを犠牲にする。
とりあえず、Mapでキャッシュさせるアプローチもしたのだが大失敗でした。なので、配列でキャッシュさせるやり方に戻した。
Mapだと機能は満たせても、速度は満たせない。MapのKがLongかIntegerなりになるのだが、キャッシュを探すのに、キャッシュが存在してないLongなりIntegerのオブジェクトを生成してしまうし、キャッシュヒットするならまだしも、ヒットしないこともある。
Mapでキャッシュさせる時のべからずを得た。
ちなみに、Classをキーにするような奴は大丈夫。getClass()は速い。
今回ので、-10000〜10000までのBigIntegerとBigDecimalをキャッシュさせてみたが、こんなにキャッシュするのはアホらしい。
やはり、BigDecimal.ZEROのような定数宣言の形式にするのが良いだろう。