Предположим, я выполняю ни один из приведенных ниже фрагментов кода для списка 1000 Event
записей (в allEventsToAggregate
). Я видел бы улучшение производительности в первой реализации, если события в allEventsToAggregate
отсортированы по customerId
, причем каждый клиент имеет примерно 3 события? Это, по существу, вопрос сравнения строк с HashMap
.Производительность дополнительных строк сравнения vs HashMap lookups
Вариант 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);
}
Это тоже моя мысль. Просто ради любопытства, я действительно удивляюсь, в какой момент это будет иметь значение. Что, если куски клиентов События составляли около 1000 человек, а мои общие записи составляли 1 миллион? – pkananen
@pkananen: Точка, в которой это имеет значение, - это точка, в которой профилирование приложения показывает, что в этом конкретном фрагменте кода тратится нематериальное количество времени, и вам 1) нужно ускорить работу и 2) не может получить столько «взрыва для вашего доллара», оптимизируя любые другие горячие точки. ;-) –
Да, я согласен. Это был скорее теоретический вопрос. – pkananen