From c5f1a8341f9c0565dab7b116566513620c18574c Mon Sep 17 00:00:00 2001 From: Patrick Schmitt Date: Fri, 6 Oct 2023 10:30:19 +0200 Subject: [PATCH] Issue 1957: Presize HashMap allocations in UnitOfWorkImpl (#1958) add initial size to map creation where expected size is known or can be estimated Signed-off-by: Patrick Schmitt --- .../internal/sessions/UnitOfWorkImpl.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java index 4584aaecee2..cccb1fd1d58 100644 --- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java +++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java @@ -107,6 +107,7 @@ import java.util.Map; import java.util.Set; import java.util.Vector; +import java.util.stream.Collectors; /** * Implementation of org.eclipse.persistence.sessions.UnitOfWork @@ -709,8 +710,9 @@ public UnitOfWorkChangeSet calculateChanges(Map registeredObjects, UnitOfWorkCha // Second calculate changes for all registered objects. Iterator objects = allObjects.keySet().iterator(); - Map changedObjects = new IdentityHashMap(); - Map visitedNodes = new IdentityHashMap(); + int allObjectsSize = allObjects.size(); + Map changedObjects = new IdentityHashMap(allObjectsSize); + Map visitedNodes = new IdentityHashMap(allObjectsSize); while (objects.hasNext()) { Object object = objects.next(); @@ -786,7 +788,7 @@ public UnitOfWorkChangeSet calculateChanges(Map registeredObjects, UnitOfWorkCha if (this.shouldDiscoverNewObjects && !changedObjects.isEmpty()) { // Third discover any new objects from the new or changed objects. - Map newObjects = new IdentityHashMap(); + Map newObjects = new IdentityHashMap(changedObjects.size()); // Bug 294259 - Do not replace the existingObjects list // Iterate over the changed objects only. discoverUnregisteredNewObjects(changedObjects, newObjects, getUnregisteredExistingObjects(), visitedNodes); @@ -807,8 +809,9 @@ public UnitOfWorkChangeSet calculateChanges(Map registeredObjects, UnitOfWorkCha // Remove any orphaned privately owned objects from the UnitOfWork and ChangeSets, // these are the objects remaining in the UnitOfWork privateOwnedObjects map if (hasPrivateOwnedObjects()) { - Map visitedObjects = new IdentityHashMap(); - for (Set privateOwnedObjects : getPrivateOwnedObjects().values()) { + Collection values = getPrivateOwnedObjects().values(); + Map visitedObjects = new IdentityHashMap(values.stream().collect(Collectors.summingInt(Set::size))); + for (Set privateOwnedObjects : values) { for (Object objectToRemove : privateOwnedObjects) { performRemovePrivateOwnedObjectFromChangeSet(objectToRemove, visitedObjects); } @@ -5027,8 +5030,9 @@ protected void setNewObjectsCloneToOriginal(Map newObjects) { protected void setupPrimaryKeyToNewObjects() { primaryKeyToNewObjects = null; if (hasNewObjects()) { - primaryKeyToNewObjects = new HashMap<>(); - getNewObjectsCloneToOriginal().forEach((object, o2) -> { + Map newObjects = getNewObjectsCloneToOriginal(); + primaryKeyToNewObjects = new HashMap<>(newObjects.size()); + newObjects.forEach((object, o2) -> { addNewObjectToPrimaryKeyToNewObjects(object); }); }