簡體   English   中英

緩存java.lang.Double

[英]caching of java.lang.Double

我的程序中有很多Doubles(注意大寫D),我在考慮一種可能的緩存機制。

通過查看Double構造函數/工廠,實際上沒有一個實現“緩存”(例如Integer的工作方式,例如,在使用valueOf )。

我當時正在考慮通過使用HashMap<String,Double>來實現這樣的緩存,其中鍵是字符串表示形式。

這樣實施有什么明顯的缺點/缺點嗎?

我不知道為什么Java尚未完成或提供此功能。

您的問題在於,任何可能的緩存機制都將使用比您可能節省的內存和處理器更多的內存。

試想一下您的示例-創建String,進行地圖查找,垃圾回收String等。

這比創建一個新的Double還要多得多的工作。

HashMap本身將使用大量內存。

考慮到可能的Double值的數量,您打算以某種方式使它們從緩存中過期還是會永遠增長?

某種程度上講,用於雙精度緩存的自然鍵將是“新Double”本身(幾乎可以肯定比String方法更快)。

您還需要考慮平等。 例如,嘗試使用java:

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

結果是錯誤的,因為每個半部生成的雙精度值相差很小。 但是,如果從緩存中獲取Double,那么您想要(1-0.9)和(0.1)擁有相同的Double嗎?

因此,您正在打開大量復雜的蠕蟲罐,以節省極少的費用(實際上,您不太可能進行保存,很可能實際上會放慢速度並使用更多的內存,而不是更少)。

獲得更高效率的唯一真實方法就是使用double而不是Double(盡管我意識到這並不總是可能的)。

除了很少的值(請記住1.0、0.0)之外,對於像Integer這樣的小整數值而言,還沒有如此龐大的出現簇,因此很難提供具有合理命中率的緩存常見的應用程序。

其次,便宜地檢測Double是否表示與另一個相同的值並不容易,存在+ 0.0,-0.0和NaN的邊緣情況(可能還有我沒想到的一些情況)。 下一個問題是,從緩存的值到簡單的緩存結構沒有方便的映射(int很自然地映射到Integer [])。

考慮到所有這些問題,可能根本就沒有通用的緩存Double值的實現選項。 這並不意味着您無法針對特殊情況提出建議,但是在花時間之前,您可能需要研究更易於實施的替代方案/可能產生更好的回報(例如,用Double代替Double)。 如果僅僅是一個HashMap,除非證明它是我的應用程序瓶頸,否則我什至都不會嘗試進行優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM