代码之家  ›  专栏  ›  技术社区  ›  pkananen

额外字符串比较与hashmap查找的性能

  •  2
  • pkananen  · 技术社区  · 14 年前

    假设我正在运行下面列出1000个的代码片段中的任何一个 Event 条目(in) 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);
    }
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Andrzej Doyle    14 年前

    我能看到性能提高吗

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

    因此,我将使用代码的第二个版本,因为它更清楚地表达了您的意图,因此更容易维护(而且在第一个地方稍微不容易出现细微的错误)。可维护性几乎肯定优于使应用程序更快0.001%。

        2
  •  2
  •   mcdowella    14 年前

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

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

    3)对于细微的差异,唯一真正了解的方法是在实践中对事物进行实际计时——事实上,不仅是进行比较,而且将其组织成一个成熟的科学实验。现在有太多的事情不用担心你的编译器和运行时系统选择了什么优化,CPU缓存或VM页面故障意味着什么,以及Java垃圾收集对你的算法的看法。当然,你可能会发现,对于不同版本的Java或不同的CPU、主板或内存大小的硬件,甚至系统运行的时间,以及它需要多少时间将磁盘内容迁移到内存缓存中,或者JIT编译Java的相关位,或者诸如此类,都会得到不同的答案。