From 18106ed2f407f10077bc2a698c2b835fc9a857a4 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 27 Aug 2015 19:51:50 +0200 Subject: [PATCH] Use ImmutableOffsetMap for NodeWithKey entries Number of elements allowed in NodeWithKey equals to the number of leaf nodes specified in the 'key' statement. It is usually a small number of elements, but these tend to have many instances. This patch optimizes memory usage with more than one key leaf. Instead of an ImmutableMap, in which each instance has its own unique key set, we use an ImmutableOffsetMap, which shares the key set across all instances. The cost here is a LoadingCache lookup which should prove neglible. Change-Id: I68afe667415ba1eaddbb081b419fedcae4e4b8f7 Signed-off-by: Robert Varga --- .../yangtools/yang/data/api/YangInstanceIdentifier.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java index 9c7d5c3569..caee3c30d6 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java @@ -30,6 +30,7 @@ import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.concepts.Path; import org.opendaylight.yangtools.util.HashCodeBuilder; +import org.opendaylight.yangtools.util.ImmutableOffsetMap; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; @@ -530,7 +531,8 @@ public abstract class YangInstanceIdentifier implements Path keyValues) { super(node); - this.keyValues = ImmutableMap.copyOf(keyValues); + // Retains ImmutableMap for maps with size() <= 1. For larger sizes uses a shared key set. + this.keyValues = ImmutableOffsetMap.copyOf(keyValues); } public NodeIdentifierWithPredicates(final QName node, final QName key, final Object value) { -- 2.36.6