[PATCH] AbstractStringBuilder.insert(int dstOffset, CharSequence s, int start, int end) is missing fast-path for String

Сергей Цыпанов sergei.tsypanov at yandex.ru
Fri Sep 25 14:08:08 UTC 2020


Hello,

while working with StringBuilder.insert() I've spotted that its delegate AbstractStringBuilder.insert() is missing
a fast-path for the most frequent case when its argument is String.

Previously they did similart optimization for StirngBuilder.append(CharSequence, int, int),
see https://bugs.openjdk.java.net/browse/JDK-8224986

I'd like to contribute a trivial patch that brings improvement for the case when SB's content is Latin1
and inserted String is Latin1 as well. I cannot file the issue for that so can I create a PR on GitHub without issue number?
If not please create one (if the change is relevant of course).

To measure improvement I've used simple benchmark:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
public class StringBuilderInsertBenchmark {

  @Benchmark
  public StringBuilder insert(Data data) {
    String string = data.string;
    return new StringBuilder().append("ABC").insert(1, string, 1, data.length + 1);
  }

  @State(Scope.Thread)
  public static class Data {
    String string;

    @Param({"true", "false"})
    private boolean latin;

    @Param({"8", "64", "128", "1024"})
    private int length;

    @Setup
    public void setup() {
      String alphabet = latin
        ? "abcdefghijklmnopqrstuvwxyz"        // English
        : "абвгдеёжзиклмнопрстуфхцчшщьыъэюя"; // Russian

      string = new RandomStringGenerator().randomString(alphabet, length + 2);
    }
  }
}

Which gives

            (latin)  (length)       original       patched    Units

insert         true         8    24.2 ±  0.1   22.2 ±  0.0    ns/op
insert         true        64    53.8 ±  0.2   36.1 ±  0.1    ns/op
insert         true       128    80.9 ±  0.2   44.6 ±  0.0    ns/op
insert         true      1024   365.4 ±  0.5  109.8 ±  3.9    ns/op

insert        false         8    33.5 ±  0.5   32.3 ±  0.2    ns/op
insert        false        64    73.2 ±  0.3   73.2 ±  0.2    ns/op
insert        false       128   103.9 ±  0.6  103.3 ±  0.1    ns/op
insert        false      1024   576.5 ±  4.8  569.5 ±  2.0    ns/op

Patch is attached. As of tests tier1 and tier2 are ok

With best regards,
Sergey Tsypanov
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ASB.patch
Type: text/x-diff
Size: 3102 bytes
Desc: not available
URL: <https://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20200925/791afcec/ASB-0001.patch>


More information about the core-libs-dev mailing list