Repository: incubator-unomi
Updated Branches:
  refs/heads/feature-UNOMI-70-ES5X 96a018ecb -> dafa9f6b3


New segment update optimization, hopefully will work better than the last one.


Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/d7a79695
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/d7a79695
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/d7a79695

Branch: refs/heads/feature-UNOMI-70-ES5X
Commit: d7a7969578817eebf7a72c0c364200f0f084bb10
Parents: 2263da9
Author: Serge Huber <[email protected]>
Authored: Tue Dec 6 13:42:54 2016 +0100
Committer: Serge Huber <[email protected]>
Committed: Tue Dec 6 13:42:54 2016 +0100

----------------------------------------------------------------------
 .../services/services/SegmentServiceImpl.java   | 26 +++++++++++++++++---
 1 file changed, 22 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/d7a79695/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
 
b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
index d1f120f..3a64be1 100644
--- 
a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
+++ 
b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
@@ -831,10 +831,28 @@ public class SegmentServiceImpl implements 
SegmentService, SynchronousBundleList
             List<Profile> previousProfiles = 
persistenceService.query(segmentCondition, null, Profile.class);
             List<Profile> newProfiles = 
persistenceService.query(segment.getCondition(), null, Profile.class);
 
-            Set<Profile> profilesToAdd = new HashSet<>(newProfiles);
-            Set<Profile> profilesToRemove = new HashSet<>(previousProfiles);
-            profilesToAdd.removeAll(previousProfiles);
-            profilesToRemove.removeAll(newProfiles);
+            // we use sets instead of lists to speed up contains() calls that 
are very expensive on lists.
+
+            // we use to use removeAll calls but these are expensive because 
they require lots of copies upon element
+            // removal so we implemented them with adds instead.
+            //profilesToAdd.removeAll(previousProfiles);
+            //profilesToRemove.removeAll(newProfiles);
+
+            Set<Profile> newProfilesSet = new HashSet<>(newProfiles);
+            Set<Profile> previousProfilesSet = new HashSet<>(previousProfiles);
+            Set<Profile> profilesToAdd = new HashSet<>(newProfilesSet.size() / 
2);
+            for (Profile newProfile : newProfilesSet) {
+                if (!previousProfilesSet.contains(newProfile)) {
+                    profilesToAdd.add(newProfile);
+                }
+            }
+            Set<Profile> profilesToRemove = new 
HashSet<>(previousProfilesSet.size() / 2);
+            for (Profile previousProfile : previousProfilesSet) {
+                if (!newProfilesSet.contains(previousProfile)) {
+                    profilesToRemove.add(previousProfile);
+                }
+            }
+
 
             for (Profile profileToAdd : profilesToAdd) {
                 profileToAdd.getSegments().add(segment.getItemId());

Reply via email to