【问题标题】:Performance of extra string comparisons vs HashMap lookups额外字符串比较与 HashMap 查找的性能
【发布时间】:2010-08-06 16:50:13
【问题描述】:

假设我正在运行以下任一代码 sn-ps 以获得 1000 个Event 条目的列表(在allEventsToAggregate 中)。如果allEventsToAggregate 中的事件按customerId 排序,每个客户大约有3 个事件,我会在第一个实现中看到性能改进吗?这本质上是字符串比较与HashMap 查找性能的问题。

选项 1:

Map<String, List<Event>> eventsByCust = new HashMap<String, List<Event>>();
List<Event> thisCustEntries;
String lastCust = null;
for (Event thisEvent : allEventsToAggregate) {
    if (!thisEvent.getCustomerId().equals(lastCust)) {
        thisCustEntries = eventsByCust.get(thisEvent.getCustomerId());
        if (thisCustEntries == null) {
            thisCustEntries = new ArrayList<Event>();
        }
    }
    thisCustEntries.add(thisEvent);
    eventsByCust.put(thisEvent.getCustomerId(), thisCustEntries);
    lastCust = thisEvent.getCustomerId();
}

选项 2:

Map<String, List<Event>> eventsByCust = new HashMap<String, List<Event>>();
for (Event thisEvent : allEventsToAggregate) {
    List<Event> thisCustEntries = eventsByCust.get(thisEvent.getCustomerId());
    if (thisCustEntries == null) {
        thisCustEntries = new ArrayList<Event>();
    }
    thisCustEntries.add(thisEvent);
}

【问题讨论】:

    标签: java performance algorithm


    【解决方案1】:

    我会看到性能改进

    几乎肯定不会。除非此块代表您的应用程序的关键内部循环,否则任何边际性能提升几乎肯定不会引起注意。

    因此,我会选择第二个版本的代码,因为它更清晰地表达了您的意图,因此更容易维护(并且首先不太容易出现细微的错误)。几乎可以肯定,可维护性胜过让应用程序速度提高 0.001%。

    【讨论】:

    • 这也是我的想法。只是出于好奇,我确实想知道在什么时候它会很重要。如果每个客户事件块大约有 1000 个,而我的总记录是 100 万条呢?
    • @pkananen:重要的一点是,分析应用程序表明它在这个特定的代码块中花费了不可忽略的时间,你 1) 需要加快速度,并且 2) 优化任何其他热点无法获得尽可能多的“物有所值”。 ;-)
    • 是的,我同意。这更像是一个理论问题。
    【解决方案2】:

    1) 请记住,从 HashMap 中成功检索项目需要进行字符串比较以确认您确实找到了正确的项目。

    2) 我们似乎在谈论执行时间上的非常小的差异,而不是真正的算法改进。是否真的值得为此失去可读性?

    3) 对于微小的差异,真正了解的唯一方法是在实践中实际计时——实际上不仅是进行比较,而且将其组织为一个成熟的科学实验。这些天来,您的编译器和运行时系统选择优化什么,cpu 缓存或 VM 页面错误意味着什么,以及 Java 垃圾收集对您的算法的看法,实在是太多了。然后,当然,您可能会发现对于不同版本的 Java 或在具有不同 cpu、主板或内存大小的硬件上,甚至系统运行了多长时间以及它必须运行多长时间,您会得到不同的答案。将其磁盘内容迁移到内存缓存中,或 JIT 编译 Java 的相关位,或其他。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多