Optimize AbstractDocumentedDataNodeContainer.getDataChildByName() 49/9349/4
authorRobert Varga <rovarga@cisco.com>
Sat, 26 Jul 2014 01:55:20 +0000 (03:55 +0200)
committerRobert Varga <rovarga@cisco.com>
Sat, 26 Jul 2014 15:51:32 +0000 (17:51 +0200)
Datastore-intensive workload shows 2% CPU expended in this method, with
three quarters of that actually eaten up by the iterator (and the rest by
1M invocations of QName.equals()). Given that we know that childNodes
are keyed by the QName, this is utterly wasteful, so let's do a simple
lookup.

Change-Id: I44688cb92031b2d75a09d58bd76c63bb28ccbfae
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractDocumentedDataNodeContainer.java

index 259a48e471b47005bce8dbb8d7bb9e1871956542..30e28d46bde7c04ae1b2e1be768fb34a6f67f2b7 100644 (file)
@@ -1,9 +1,18 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
 package org.opendaylight.yangtools.yang.parser.builder.util;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+
 import java.util.Map;
 import java.util.Set;
+
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -46,12 +55,8 @@ public abstract class AbstractDocumentedDataNodeContainer extends AbstractDocume
 
     @Override
     public final DataSchemaNode getDataChildByName(final QName name) {
-        for (DataSchemaNode node : childNodes.values()) {
-            if (node.getQName().equals(name)) {
-                return node;
-            }
-        }
-        return null;
+        // Child nodes are keyed by their container name, so we can do a direct lookup
+        return childNodes.get(name);
     }
 
     @Override