From 3a1da8e23805b36351172eeb7f11bc134821ee36 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 14 Apr 2019 16:22:50 +0200 Subject: [PATCH] Optimize source generation Since StringBuilder is fluent, we can optimize some of the source generation utilities to have less bytecode. Also mark FIXMEs for future improvement, as these would allow better devirtualization. Furthermore we expose Class-based cast/assign operations, which trim down code duplication a tiny bit. Change-Id: I32d9d9321992effe0bec1423990208a92c1f780b Signed-off-by: Robert Varga --- .../DataNodeContainerSerializerSource.java | 42 +++++++++---------- .../gen/impl/DataObjectSerializerSource.java | 1 + .../dom/codec/gen/spi/AbstractSource.java | 28 ++++++++----- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataNodeContainerSerializerSource.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataNodeContainerSerializerSource.java index deb82f6117..004cbadc3e 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataNodeContainerSerializerSource.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataNodeContainerSerializerSource.java @@ -60,29 +60,28 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou @Override protected CharSequence getSerializerBody() { - final StringBuilder sb = new StringBuilder(); - sb.append("{\n"); - sb.append(statement(assign(DataObjectSerializerRegistry.class.getName(), REGISTRY, "$1"))); - sb.append(statement(assign(dtoType.getFullyQualifiedName(), INPUT, - cast(dtoType.getFullyQualifiedName(), "$2")))); - sb.append(statement(assign(BindingStreamEventWriter.class.getName(), STREAM, - cast(BindingStreamEventWriter.class.getName(), "$3")))); - sb.append(statement(assign(BindingSerializer.class.getName(), SERIALIZER, null))); - sb.append("if ("); - sb.append(STREAM); - sb.append(" instanceof "); - sb.append(BindingSerializer.class.getName()); - sb.append(") {"); - sb.append(statement(assign(SERIALIZER, cast(BindingSerializer.class.getName(), STREAM)))); - sb.append('}'); - sb.append(statement(emitStartEvent())); + final StringBuilder sb = new StringBuilder() + .append("{\n") + .append(statement(assign(DataObjectSerializerRegistry.class, REGISTRY, "$1"))) + .append(statement(assign(dtoType, INPUT, cast(dtoType, "$2")))) + .append(statement(assign(BindingStreamEventWriter.class, STREAM, + cast(BindingStreamEventWriter.class, "$3")))) + .append(statement(assign(BindingSerializer.class, SERIALIZER, null))) + .append("if (") + .append(STREAM) + .append(" instanceof ") + .append(BindingSerializer.class.getName()) + .append(") {") + .append(statement(assign(SERIALIZER, cast(BindingSerializer.class, STREAM)))) + .append('}') + .append(statement(emitStartEvent())); emitBody(sb); emitAfterBody(sb); - sb.append(statement(endNode())); - sb.append(statement("return null")); - sb.append('}'); - return sb; + + return sb.append(statement(endNode())) + .append(statement("return null")) + .append('}'); } /** @@ -167,8 +166,7 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou staticConstant(propertyName, DataObjectSerializerImplementation.class, ChoiceDispatchSerializer.from(loadClass(childType))); sb.append(tryToUseCacheElse(getterName, statement(invoke(propertyName, - StreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, cast(DataObject.class.getName(), getterName), - STREAM)))); + StreamWriterGenerator.SERIALIZE_METHOD_NAME, REGISTRY, cast(DataObject.class, getterName), STREAM)))); } } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataObjectSerializerSource.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataObjectSerializerSource.java index 8ec0a4d631..79d47c42eb 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataObjectSerializerSource.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataObjectSerializerSource.java @@ -61,6 +61,7 @@ abstract class DataObjectSerializerSource extends AbstractSource { */ protected abstract CharSequence getSerializerBody(); + // FIXME: 5.0.0: consider optimizing streaming use through returning StringBuilder from common methods protected static final CharSequence leafNode(final String localName, final CharSequence value) { return invoke(STREAM, "leafNode", escape(localName), value); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/spi/AbstractSource.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/spi/AbstractSource.java index 45b1772239..64c6c500a4 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/spi/AbstractSource.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/spi/AbstractSource.java @@ -11,9 +11,11 @@ import com.google.common.collect.Iterators; import com.google.common.collect.UnmodifiableIterator; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import org.opendaylight.mdsal.binding.model.api.Type; +// FIXME: 5.0.0: consider optimizing streaming use through returning StringBuilder from common methods public abstract class AbstractSource { private final Set staticConstants = new HashSet<>(); @@ -28,8 +30,7 @@ public abstract class AbstractSource { private static StringBuilder commonInvoke(final CharSequence object, final String methodName) { final StringBuilder sb = new StringBuilder(); if (object != null) { - sb.append(object); - sb.append('.'); + sb.append(object).append('.'); } return sb.append(methodName).append('('); } @@ -59,16 +60,23 @@ public abstract class AbstractSource { protected static final CharSequence assign(final String type, final String var, final CharSequence value) { final StringBuilder sb = new StringBuilder(); if (type != null) { - sb.append(type); - sb.append(' '); + sb.append(type).append(' '); } return sb.append(var).append(" = ").append(value); } + protected static final CharSequence assign(final Class type, final String var, final CharSequence value) { + return assign(type.getName(), var, value); + } + protected static final CharSequence assign(final Type type, final String var, final CharSequence value) { return assign(type.getFullyQualifiedName(), var, value); } + protected static final CharSequence cast(final Class type, final CharSequence value) { + return cast(type.getName(), value); + } + protected static final CharSequence cast(final Type type, final CharSequence value) { return cast(type.getFullyQualifiedName(), value); } @@ -79,12 +87,12 @@ public abstract class AbstractSource { protected static final CharSequence forEach(final String iterable, final String iteratorName, final String valueType, final String valueName, final CharSequence body) { - final StringBuilder sb = new StringBuilder(); - sb.append(statement(assign(java.util.Iterator.class.getName(), iteratorName, invoke(iterable, "iterator")))); - sb.append("while (").append(invoke(iteratorName, "hasNext")).append(") {\n"); - sb.append(statement(assign(valueType, valueName,cast(valueType, invoke(iteratorName, "next"))))); - sb.append(body); - return sb.append("\n}\n"); + return new StringBuilder() + .append(statement(assign(Iterator.class, iteratorName, invoke(iterable, "iterator")))) + .append("while (").append(invoke(iteratorName, "hasNext")).append(") {\n") + .append(statement(assign(valueType, valueName, cast(valueType, invoke(iteratorName, "next"))))) + .append(body) + .append("\n}\n"); } protected static final CharSequence statement(final CharSequence statement) { -- 2.36.6