Производительность дополнительных сравнений строк по сравнению с поиском в HashMap - PullRequest
2 голосов
/ 06 августа 2010

Предположим, я выполняю любой из приведенных ниже фрагментов кода для списка из 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);
}

Ответы [ 2 ]

3 голосов
/ 06 августа 2010

Могу ли я увидеть улучшение производительности

Почти наверняка нет. Если этот блок не представляет собой критический внутренний цикл вашего приложения, любое предельное повышение производительности почти наверняка будет незаметным.

Следовательно, я бы остановился на второй версии кода, так как она будет более ясным выражением вашего намерения и, следовательно, будет проще в обслуживании (а также в меньшей степени подвержена незначительным ошибкам в первую очередь). Техобслуживание почти наверняка превзойдёт скорость выполнения приложения на 0,001%.

2 голосов
/ 07 августа 2010

1) Помните, что для успешного извлечения элемента из HashMap требуется сравнение строк, чтобы подтвердить, что вы действительно нашли правильный элемент.

2) Кажется, мы говорим об очень небольших различиях в исполнениивремя, а не реальные алгоритмические улучшения.Стоит ли терять из-за этого удобочитаемость?

3) Для небольших различий единственный способ действительно узнать это - на самом деле рассчитать время на практике - фактически не только для проведения сравнения, но и для его организации.как полноценный научный эксперимент.В наши дни слишком много нужно беспокоиться о том, что ваш компилятор и система времени выполнения решили оптимизировать, что означает кэширование процессора или страницы VM и что думает сборщик мусора Java о вашем алгоритме.Тогда, конечно, вы можете обнаружить, что вы получаете разные ответы для разных версий Java или на оборудовании с разными процессорами, материнскими платами или объемами памяти, или даже с тем, как долго система работает и сколько времени ей понадобилосьперенести содержимое своего диска в кэш-память или JIT-компилировать соответствующие биты Java или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...