きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

数字のキャッシュ、続編。

とりあえず実装してみた。


BigIntegerCacheとBigDecimalCache。
Sunのクラスと、ほぼ同じ作りだが、BigDecimalCacheはBigIntegerCacheの依存させている。メソッドは基本的にvalueOfのみ。


キャッシュを考える時、それがヒープを抑えるためのキャッシュか、速度を速くするためのキャッシュかの違いを意識する必要がある。
僕が今回目指してるのは速度を速くするキャッシュで、ヒープを犠牲にする。


とりあえず、Mapでキャッシュさせるアプローチもしたのだが大失敗でした。なので、配列でキャッシュさせるやり方に戻した。
Mapだと機能は満たせても、速度は満たせない。MapのKがLongかIntegerなりになるのだが、キャッシュを探すのに、キャッシュが存在してないLongなりIntegerのオブジェクトを生成してしまうし、キャッシュヒットするならまだしも、ヒットしないこともある。


Mapでキャッシュさせる時のべからずを得た。
ちなみに、Classをキーにするような奴は大丈夫。getClass()は速い。


今回ので、-10000〜10000までのBigIntegerとBigDecimalをキャッシュさせてみたが、こんなにキャッシュするのはアホらしい。
やはり、BigDecimal.ZEROのような定数宣言の形式にするのが良いだろう。