From e7d7fb0625530d08c4ed15c326efd72fa2b00017 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 16 Jan 2015 17:53:54 +0100 Subject: [PATCH] Improve BaseTemplate speed String processing is sub-optimal in these aspects: - string-based methods used when character-based ones are available, - inefficient use of String.replace() for single-character filtering, - inefficient use of String.replaceAll() where a pre-compiled Pattern should be used. - inefficient use of StringTokenizer where a Splitter can be used Change-Id: Iee446a4279b9be343891192d93a84a420b32526c Signed-off-by: Robert Varga --- .../sal/java/api/generator/BaseTemplate.xtend | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend index 9ca7fa9b51..272a9f6438 100644 --- a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend +++ b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.sal.java.api.generator import com.google.common.base.CharMatcher +import com.google.common.base.Splitter import com.google.common.collect.ImmutableList import com.google.common.collect.Range import java.math.BigDecimal @@ -18,6 +19,7 @@ import java.util.HashMap import java.util.List import java.util.Map import java.util.StringTokenizer +import java.util.regex.Pattern import org.opendaylight.yangtools.binding.generator.util.Types import org.opendaylight.yangtools.sal.binding.model.api.ConcreteType import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty @@ -31,7 +33,11 @@ abstract class BaseTemplate { protected val GeneratedType type; protected val Map importMap; - private static final String NEW_LINE = '\n' + private static final char NEW_LINE = '\n' + private static final CharMatcher NL_MATCHER = CharMatcher.is(NEW_LINE) + private static final CharMatcher TAB_MATCHER = CharMatcher.is('\t') + private static final Pattern SPACES_PATTERN = Pattern.compile(" +") + private static final Splitter NL_SPLITTER = Splitter.on(NL_MATCHER) new(GeneratedType _type) { if (_type == null) { @@ -168,18 +174,15 @@ abstract class BaseTemplate { } def String wrapToDocumentation(String text) { - val StringTokenizer tokenizer = new StringTokenizer(text, "\n", false) - val StringBuilder sb = new StringBuilder() - - if(text.empty) + if (text.empty) return "" - sb.append("/**") + val StringBuilder sb = new StringBuilder("/**") sb.append(NEW_LINE) - while(tokenizer.hasMoreTokens) { + for (String t : NL_SPLITTER.split(text)) { sb.append(" * ") - sb.append(tokenizer.nextToken) + sb.append(t) sb.append(NEW_LINE) } sb.append(" */") @@ -238,7 +241,7 @@ abstract class BaseTemplate { var char lastChar = ' ' var boolean badEnding = false - if(text.endsWith(".") || text.endsWith(":") || text.endsWith(",")) { + if (text.endsWith('.') || text.endsWith(':') || text.endsWith(',')) { tempText = text.substring(0, text.length - 1) lastChar = text.charAt(text.length - 1) badEnding = true @@ -265,9 +268,9 @@ abstract class BaseTemplate { var boolean isFirstElementOnNewLineEmptyChar = false; formattedText = formattedText.encodeJavadocSymbols - formattedText = formattedText.replace(NEW_LINE, "") - formattedText = formattedText.replace("\t", "") - formattedText = formattedText.replaceAll(" +", " "); + formattedText = NL_MATCHER.removeFrom(formattedText) + formattedText = TAB_MATCHER.removeFrom(formattedText) + formattedText = SPACES_PATTERN.matcher(formattedText).replaceAll(" ") val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true); -- 2.36.6