Supposons que j'exécute l'un des extraits de code ci-dessous pour une liste de 1000 entrées Event
(dans allEventsToAggregate
). Est-ce que je verrais une amélioration des performances dans la première implémentation si les événements dans allEventsToAggregate
sont triés par customerId
, avec chaque client ayant environ 3 événements? C'est essentiellement une question de comparaison de chaîne par rapport à la performance de recherche HashMap
.Performances des comparaisons de chaînes supplémentaires par rapport aux recherches HashMap
Option 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();
}
Option 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);
}
C'est aussi ma pensée. Juste pour la curiosité, je me demande à quel point ce serait important. Que se passerait-il si les morceaux des clients étaient autour de 1000 chacun, et que mes records totaux étaient de 1 million? – pkananen
@pkananen: Le point auquel il importe, est le point où le profilage de l'application montre qu'il passe une quantité non négligeable de temps dans ce morceau particulier de code, et vous 1) devez accélérer les choses, et 2) ne peut pas obtenir autant de «bang pour votre argent» en optimisant les autres hotspots. ;-) –
Oui, je suis d'accord. C'était plus d'une question théorique. – pkananen