簡體   English   中英

重用數組中的哈希圖

[英]Reuse hashmaps in array

我拿着一個哈希表數組,我想獲得最大的性能和內存使用率,所以我想在一個數組中恢復哈希表。

因此,當數組中不再有哈希表並且我想要向該數組中添加新的哈希表時,我只需清除哈希表並使用put()來添加新值。

當我從數組中撤回哈希圖時,我還需要復制回值。

我不確定這是否比每次創建new HashMap()更好。 什么是更好的?

UPDATE

需要循環約5000萬個哈希圖,每個哈希圖具有約10個鍵值對。 如果數組的大小為20,000,我只需要20,000哈希圖,而不是5000萬個新的hashmaps()

使用這種方法時要非常小心。 盡管從性能上考慮回收對象可能更好,但是您可能會多次修改相同的引用而遇到麻煩,如下例所示:

public class A {
    public int counter = 0;

    public static void main(String[] args) {

         A a = new A();
         a.counter = 5;
         A b = a; // I want to save a into b and then recycle a for other purposes
         a.counter = 10; // now b.counter is also 10
    }
}

我確定你明白了,但是,如果不從數組中復制對HashMaps的引用,那應該沒問題。

沒關系 過早的優化。 當有探查器結果告訴您實際在哪里花費最大內存或CPU周期時,請返回

完全不清楚為什么以這種方式重新使用映射會提高性能和/或內存使用率。 就我們所知,這可能沒有什么不同,或者可能產生相反的效果。

您應該對可讀性最高的代碼進行任何處理,然后進行概要分析,最后優化概要分析器突出顯示為瓶頸的代碼部分。

在大多數情況下,您不會有任何區別。

通常,地圖條目的數量比地圖對象的數量大得多。 填充地圖時,將為每個條目創建Map.Entry實例。 這是一個重量較輕的對象,但是無論如何您都要調用new 沒有數據的地圖本身也是輕量級的,因此,除非您的地圖可以容納1-2個條目,否則您將不會從這些技巧中獲得任何好處。

底線。 忘記過早的優化。 實施您的應用程序。 如果您在應用程序性能方面遇到問題,請找出瓶頸並進行修復。 我可以99%向您保證,瓶頸永遠不會出現在new HashMap()調用中。

我認為您想要的是一種對象池,您可以從對象池中獲取一個對象(在您的情況下為HashMap),執行操作,如果不再需要該對象,則將其放回池中。

檢查對象池設計模式,以獲取更多參考,請檢查此鏈接:

http://sourcemaking.com/design_patterns/object_pool

您遇到的問題是,大多數對象都是HashMap中的Map.Entry對象。 雖然可以回收HashMap本身(及其數組),但這些只是對象的一小部分。 解決此問題的一種方法是使用來自javolution的FastMap,它回收所有內容並支持管理生命周期(其目的是通過這種方式最大程度地減少垃圾)

我懷疑最有效的方法是即使沒有使用大多數字段,也可以使用EnumMap(如果您知道鍵屬性)或POJO。

重用HashMap存在一些問題。

  • 即使鍵和值數據不占用內存(與其他位置共享), Map.Entry對象也將控制內存使用率,但不會被重用(除非您做了一些特殊的事情)。
  • 由於世代GC,通常將舊對象指向新對象是昂貴的(並且很難了解正在發生的事情)。 如果要保留數百萬個,可能不會成為問題。
  • 更復雜的代碼更難以優化。 因此,請保持簡單,然后進行大的優化,這可能涉及更改數據結構。

暫無
暫無

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

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