缓存java.lang.Double

时间:2014-01-28 16:30:55

标签: java double

我的程序中有很多双打(注意大写字母D),我正在考虑一种可能的缓存机制。

通过查看Double构造函数/工厂,没有人实际实现“缓存”(就像Integer的工作方式一样,例如在使用valueOf时)。

我正在考虑使用HashMap<String,Double>来实现这样的缓存,其中键是字符串表示。

这种实施有任何明显的缺点/缺点吗?

我想知道为什么Java没有完成或提供这个。

2 个答案:

答案 0 :(得分:3)

您的问题是,任何可能的缓存机制都将使用比您可能节省的内存和处理器更多的功能。

想想你的例子 - 创建String,进行地图查找,垃圾收集字符串等等。

除了创建一个新的Double之外,还有很多工作要做。

HashMap本身会占用大量内存。

考虑到可能的Double值的数量,你会以某种方式从缓存中过期它们还是会永远增长?

有点人都知道,使用双精度缓存的自然键本身就是一个“新双精度”(几乎肯定比String方法更快)。

您还需要考虑平等。例如,尝试使用java:

System.out.println((1-0.9)==0.1);

结果是错误的,因为每一半产生的双值因微小分数而不同。但是如果从缓存中获得Double,你会想要(1-0.9)和(0.1)相同的Double吗?

所以你正在开辟一个庞大复杂的蠕虫病毒,节省非常小的费用(实际上你不太可能保存,很可能你实际上会减慢速度并减少使用更多的内存)。

获得更高效率的唯一真正方法是使用double而不是Double(尽管我意识到并非总是可行)。

答案 1 :(得分:2)

除了很少的值(1.0,0.0跳到脑海)之外,对于小整数值没有像Integer那样的压倒性聚类,所以很难找到一个合理的缓存普通应用的命中率。

其次,它的很容易便宜地检测一个Double是否代表与另一个相同的值,有边缘情况有+0.0,-0.0和NaN(可能还有几个我没想到的)。接下来的问题是没有方便的从缓存值到简单缓存结构的映射(int很自然地映射到Integer [])。

考虑到所有这些问题,可能根本没有用于缓存Double值的通常值得实现的选项。这并不意味着你不能为专业案例提出一个,但在花时间之前,你可能想要研究更容易实现/产生潜在更好回报的替代方案(例如,双倍而不是双倍)。如果它的只是那个HashMap,我甚至不愿意尝试优化,除非它被证明是我的应用程序的瓶颈。