From 365791006303aefaa3a627f8d1845b74774b8c20 Mon Sep 17 00:00:00 2001 From: "Diego E. Alonso-Blas" Date: Tue, 22 Oct 2019 23:30:09 +0200 Subject: [PATCH] ConsoleAppender: reuse/recycle StringBuilder storage. A StringBuilder is a mutable data structure to create a String. When the String is created, the new String does not share any storage with the StringBuilder. Thus, we can keep a same StringBuilder, and reuse its internal storage between different iterations. --- .../src/main/scala/sbt/internal/util/ConsoleAppender.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala index d205eb3bf..d0bd1a309 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala @@ -2,6 +2,7 @@ package sbt.internal.util import sbt.util._ import java.io.{ PrintStream, PrintWriter } +import java.lang.StringBuilder import java.util.Locale import java.util.concurrent.atomic.{ AtomicBoolean, AtomicInteger, AtomicReference } import org.apache.logging.log4j.{ Level => XLevel } @@ -507,10 +508,10 @@ class ConsoleAppender private[ConsoleAppender] ( message: String ): Unit = out.lockObject.synchronized { + val builder: StringBuilder = new StringBuilder(labelColor.length + label.length + messageColor.length + reset.length * 3) message.linesIterator.foreach { line => - val builder = new java.lang.StringBuilder( - labelColor.length + label.length + messageColor.length + line.length + reset.length * 3 + 3 - ) + builder.ensureCapacity(labelColor.length + label.length + messageColor.length + line.length + reset.length * 3 + 3) + builder.setLength(0) def fmted(a: String, b: String) = builder.append(reset).append(a).append(b).append(reset) builder.append(reset).append('[') fmted(labelColor, label)