From 0a108f9ef2f9f4c88ac146aef6b62032cfc4b91e Mon Sep 17 00:00:00 2001 From: "Tagir F. Valeev" Date: Tue, 16 Jun 2020 03:16:41 +0000 Subject: [PATCH] 8247605: Avoid array allocation when concatenating with empty string Reviewed-by: redestad, plevart --- .../classes/java/lang/StringConcatHelper.java | 8 ++++++++ .../org/openjdk/bench/java/lang/StringConcat.java | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/lang/StringConcatHelper.java b/src/java.base/share/classes/java/lang/StringConcatHelper.java index 7e676307865..641def5bb93 100644 --- a/src/java.base/share/classes/java/lang/StringConcatHelper.java +++ b/src/java.base/share/classes/java/lang/StringConcatHelper.java @@ -406,6 +406,14 @@ final class StringConcatHelper { static String simpleConcat(Object first, Object second) { String s1 = stringOf(first); String s2 = stringOf(second); + if (s1.isEmpty()) { + // newly created string required, see JLS 15.18.1 + return new String(s2); + } + if (s2.isEmpty()) { + // newly created string required, see JLS 15.18.1 + return new String(s1); + } // start "mixing" in length and coder or arguments, order is not // important long indexCoder = mix(initialCoder(), s1); diff --git a/test/micro/org/openjdk/bench/java/lang/StringConcat.java b/test/micro/org/openjdk/bench/java/lang/StringConcat.java index dffff9b5d8a..b15b1d0a0c0 100644 --- a/test/micro/org/openjdk/bench/java/lang/StringConcat.java +++ b/test/micro/org/openjdk/bench/java/lang/StringConcat.java @@ -28,11 +28,8 @@ import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.infra.Blackhole; -import java.util.Random; import java.util.concurrent.TimeUnit; /** @@ -54,6 +51,8 @@ public class StringConcat { public byte byteValue = (byte)-128; + public String emptyString = ""; + @Benchmark public String concatConstInt() { return "string" + intValue; @@ -64,6 +63,16 @@ public class StringConcat { return "string" + stringValue; } + @Benchmark + public String concatEmptyRight() { + return stringValue + emptyString; + } + + @Benchmark + public String concatEmptyLeft() { + return emptyString + stringValue; + } + @Benchmark public String concatMethodConstString() { return "string".concat(stringValue);