Skip to content

Commit

Permalink
Issue 1957: Presize HashMap allocations in UnitOfWorkImpl (#1958)
Browse files Browse the repository at this point in the history
add initial size to map creation where expected size is known or can be estimated

Signed-off-by: Patrick Schmitt <Patrick.Schmitt@cpb-software.com>
  • Loading branch information
Zuplyx committed Oct 6, 2023
1 parent 610b9d2 commit c5f1a83
Showing 1 changed file with 11 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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);
Expand All @@ -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<Set> 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);
}
Expand Down Expand Up @@ -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);
});
}
Expand Down

0 comments on commit c5f1a83

Please sign in to comment.