Lower SchemaPath#getPath() memory overhead 57/29457/4
authorRobert Varga <rovarga@cisco.com>
Mon, 9 Nov 2015 17:44:52 +0000 (18:44 +0100)
committerRobert Varga <rovarga@cisco.com>
Tue, 10 Nov 2015 00:21:54 +0000 (01:21 +0100)
Acquiring forward path involves performing a reverse() on an
ImmutableList -- which results in an proxy object being created.
Each such object costs 24 bytes, leading to ~120K wasted memory on a
freshly-booted up BGP+OF instance.

Eliminate this overhead by instantiating a temporary ArrayList and
copying its reverse view. This way only a single object is retained.

Change-Id: If3b193e84f0f7ffc17997360ae5b02669c119321
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/SchemaPath.java

index 9601a3910fa265b26d2023b3010981107b335242..fd4466d0343c7ac21c6634c8e896db72441c70ad 100644 (file)
@@ -12,7 +12,9 @@ import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.common.collect.UnmodifiableIterator;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
@@ -121,7 +123,11 @@ public abstract class SchemaPath implements Immutable {
     private ImmutableList<QName> getLegacyPath() {
         ImmutableList<QName> ret = legacyPath;
         if (ret == null) {
-            ret = ImmutableList.copyOf(getPathTowardsRoot()).reverse();
+            final List<QName> tmp = new ArrayList<>();
+            for (QName qname : getPathTowardsRoot()) {
+                tmp.add(qname);
+            }
+            ret = ImmutableList.copyOf(Lists.reverse(tmp));
             LEGACYPATH_UPDATER.lazySet(this, ret);
         }