Question about String.toUpperCase behaviour

Сергей Цыпанов sergei.tsypanov at yandex.ru
Fri Nov 1 06:57:59 UTC 2019


> That doesn't remove the performance difference when the string is NOT upper
> case.

When the code is C2 compiler there is no significant difference, but in interpreter mode it's noticeable.

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(value = Mode.AverageTime)
public class StringEqualityBenchmark {

  @Benchmark
  public boolean equals(Data data) {
    return data.getStr1().equals(data.getStr2());
  }

  @Benchmark
  public boolean reference(Data data) {
    return data.getStr1() == data.getStr2();
  }

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

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

    private final String latinStr1 = "AZ";
    private final String latinStr2 = latinStr1;

    private final String russianStr1 = "АЯ";
    private final String russianStr2 = russianStr1;

    String getStr1() {
      return latin ? latinStr1 : russianStr1;
    }

    String getStr2() {
      return latin ? latinStr2 : russianStr2;
    }
  }
}

This benchmark run in interpreter mode yields following results:

Benchmark                          (latin)  Mode  Cnt    Score    Error  Units
StringEqualityBenchmark.equals        true  avgt   50  212,916 ± 24,065  ns/op
StringEqualityBenchmark.reference     true  avgt   50  160,699 ±  8,948  ns/op

StringEqualityBenchmark.equals       false  avgt   50  178,818 ± 13,223  ns/op
StringEqualityBenchmark.reference    false  avgt   50  158,227 ±  8,704  ns/op

Regards,
Sergey Tsypanov


More information about the core-libs-dev mailing list