From 507dc11b8b3bf8f8bf63e66c8010c08b54e87304 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Wed, 13 Sep 2017 13:39:48 +0300 Subject: [PATCH] vcs: optimize local changes refresh - reduce iterations over TreeMap * duplicate data in HashMap/HashSet to avoid expensive `get()` from `TreeMap` with `HierarchicalFilePathComparator` --- .../vcs/changes/ChangeListsIndexes.java | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListsIndexes.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListsIndexes.java index 6833ddd2b0f5..c7fa67ac2117 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListsIndexes.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListsIndexes.java @@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; +import static com.intellij.util.containers.ContainerUtil.newHashMap; import static com.intellij.util.containers.ContainerUtil.newHashSet; public class ChangeListsIndexes { @@ -126,32 +127,30 @@ public class ChangeListsIndexes { Set> toModify) { TreeMap oldMap = myMap; TreeMap newMap = newIndexes.myMap; - Set oldFiles = oldMap.keySet(); - Set newFiles = newMap.keySet(); - final Set toRemoveSet = newHashSet(oldFiles); - toRemoveSet.removeAll(newFiles); + HashMap newHashMap = newHashMap(newMap); + for (Map.Entry entry : oldMap.entrySet()) { + FilePath s = entry.getKey(); + Data oldData = entry.getValue(); + Data newData = newHashMap.get(s); - final Set toAddSet = newHashSet(newFiles); - toAddSet.removeAll(oldFiles); - - final Set toModifySet = newHashSet(oldFiles); - toModifySet.removeAll(toRemoveSet); - - for (FilePath s : toRemoveSet) { - final Data data = oldMap.get(s); - toRemove.add(createBaseRevision(s, data)); + if (newData != null) { + if (!oldData.sameRevisions(newData)) { + toModify.add(new BeforeAfter<>(createBaseRevision(s, oldData), createBaseRevision(s, newData))); + } + } + else { + toRemove.add(createBaseRevision(s, oldData)); + } } - for (FilePath s : toAddSet) { - final Data data = newMap.get(s); - toAdd.add(createBaseRevision(s, data)); - } - for (FilePath s : toModifySet) { - final Data oldData = oldMap.get(s); - final Data newData = newMap.get(s); - assert oldData != null && newData != null; - if (!oldData.sameRevisions(newData)) { - toModify.add(new BeforeAfter<>(createBaseRevision(s, oldData), createBaseRevision(s, newData))); + + Set oldFiles = newHashSet(oldMap.keySet()); + for (Map.Entry entry : newMap.entrySet()) { + FilePath s = entry.getKey(); + Data newData = entry.getValue(); + + if (!oldFiles.contains(s)) { + toAdd.add(createBaseRevision(s, newData)); } } }