【问题标题】:Speed up hashmap writes加速 hashmap 写入
【发布时间】:2019-06-24 09:11:05
【问题描述】:

我有一个由固定数量的键组成的哈希图,这些键是预防性填充的。现在,在一个循环中,我必须检查每个键以替换值,以防它必须更改。

遗憾的是,由于需要迭代次数,它非常慢。我真的很想维护一个键值结构,因为它在我的模块顶部和末尾使用,但我想至少提高性能。

我还考虑使用 arrayList 来缩短插入时间,但在这种情况下,搜索会变慢并且我会失去键值功能。 如果我在开始时对 key 上的 arraylist 进行排序,然后使用二进制搜索查找值会怎样?

在地图上搜索和书写有更好的解决方案吗?

谢谢,

编辑:代码

  for (Entry<String, VariableInfo> entry : VariablesMap.entrySet()){

  String varName = entry.getKey();
  VariableInfo info = entry.getValue();

  Object value = info.convertToValue();

        DialogWait dialogWindow = new DialogWait();                     
        SwingWorker<Void, Void> swingWorker = new SwingWorker<Void, Void>() {

            @Override
            protected Void doInBackground() throws Exception {

                while(newTimeSet != _record.getCurrentTimeMs()) {

                    _record.stepForward();

                    if(valuesMap.get(varName)!=value)
                        valuesMap.put(varName, value);
                }
                dialogWindow.close();
                return null;
            }
        };

        swingWorker.execute();          
        dialogWindow.makeWait("Loading");                   
}

【问题讨论】:

  • 您的HashMap 有多大?密钥的类型是什么?
  • 你能量化“相当慢”吗?那张地图有多大?决定是否需要更换密钥的逻辑是什么?你能显示一些代码吗?
  • 为什么要检查每个键来替换值?
  • 很可能您通过 keySet() 循环检查了您的密钥,因此,您将 O(1) -> O(n) hashtable.get(key) 设为 O(1)。所以显示一些检查键和更新值的代码。
  • if(valuesMap.get(varName)!=value) 看起来有风险。您可能想要 ! a.equals(b) 而不是 `a != b`

标签: java performance hashmap


【解决方案1】:

现在,在一个循环中,我必须检查每个键以替换值,以防它必须更改。

如果值必须更改的条件变为真,是否有办法更新列表?所以基本上,你能在地图之外重写代码,对变化做出反应,而不是根据状态周期性地改变地图吗?这通常是对性能的极大改进,并且会使您的地图更加有用,因为它是最新的。

如果您确实必须定期检查 Map 中的每个条目,那么通过使用 map.entrySet() 并对其进行迭代,您将拥有 O(n) 的运行时。假设您无法预测有关输入的映射的信息,则无法对其进行优化。

如果您有某些条目以更高的频率或概率发生变化,您可以通过在此处应用比其他条目更高的检查频率来进行优化。为此,您可以使用LinkedHashMap。有了它,您可以插入元素,并且列表会跟踪插入的顺序。有了它,您可以轻松记住最近 n 更改的元素,并将它们优先于其他元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2013-03-03
    • 2018-11-15
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多