]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Avoid useless reallocation of empty TreeMaps and map iterators 82/4282/1
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Thu, 4 Jun 2020 22:33:16 +0000 (01:33 +0300)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Sun, 7 Jun 2020 08:42:00 +0000 (08:42 +0000)
The problem was that when the database is doing work, MainProgram.run
runs in pretty much busy loop mode and previously it was always
allocating a new TreeMap on each round and also calling Map.entrySet()
to get construct iterators for empty TreeMaps which eventually
accumulates up to somewhat signinificant amount of memory allocated.

Possibly an even more efficient way would be to have the Map be a closed
hashing hashmap instead and then sorting the data for iteration
separately.

gitlab #548

Change-Id: Ib2208dc35b270c9d682362d45f24f1fe01bb8969
(cherry picked from commit d3f7c0196ecf58b78574d8b80e1844ecb4e223d6)

bundles/org.simantics.acorn/src/org/simantics/acorn/MainProgram.java

index ec4d56c211ad54640d6d6f429d8847e8d6bf7760..ff0ab493870e54878d54eaa3774fbbb7a78c85f5 100644 (file)
@@ -70,7 +70,7 @@ public class MainProgram implements Runnable, Closeable {
                this.updateSchedules = new ArrayList[CLUSTER_THREADS];
                for(int i=0;i<clusterUpdateThreads.length;i++) {
                        clusterUpdateThreads[i] = Executors.newSingleThreadExecutor(new ClusterThreadFactory("Cluster Updater " + (i+1), false));
-                       updateSchedules[i] = new ArrayList<ClusterUpdateOperation>();
+                       updateSchedules[i] = new ArrayList<>();
                }
        }
 
@@ -93,11 +93,13 @@ public class MainProgram implements Runnable, Closeable {
 
                try {
 
+                       TreeMap<ClusterUID, List<ClusterUpdateOperation>> updates = new TreeMap<>(clusterComparator);
+
                        main:
                        while(alive) {
 
-                               TreeMap<ClusterUID, List<ClusterUpdateOperation>> updates = new TreeMap<ClusterUID, List<ClusterUpdateOperation>>(clusterComparator);
-
+                               if (!updates.isEmpty())
+                                       updates.clear();
                                operationQueue.pumpUpdates(updates);
 
                                if(updates.isEmpty()) {
@@ -167,6 +169,9 @@ public class MainProgram implements Runnable, Closeable {
                for(int i=0;i<CLUSTER_THREADS;i++)
                        updateSchedules[i].clear();
 
+               if (updates.isEmpty())
+                       return;
+
                final Semaphore s = new Semaphore(0);
 
                for(Map.Entry<ClusterUID, List<ClusterUpdateOperation>> entry : updates.entrySet()) {