jdk-24/test/micro/org/openjdk/bench/java/lang/StringCompareToDifferentLength.java
Swati Sharma b438cffdb9 8314085: Fixing scope from benchmark to thread for JMH tests having shared state
Co-authored-by: Vladimir Ivanov <vaivanov@openjdk.org>
Reviewed-by: sviswanathan, ecaspole
2023-10-03 16:01:36 +00:00

150 lines
4.9 KiB
Java

/*
* Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, BELLSOFT. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.arm.benchmarks.intrinsics;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.CompilerControl;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
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.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;
/**
* This benchmark modified from test/hotspot/jtreg/compiler/intrinsics/string/TestStringCompareToDifferentLength.java
* This benchmark can be used to measure performance of compareTo() in
* (Latin1, Latin1), (Latin1, UTF16), (UTF16, Latin1), and (UTF16, UTF16)
* comparisons.
*/
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
@Measurement(iterations = 3, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@Warmup(iterations = 3, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@Fork(3)
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public class StringCompareToDifferentLength {
@State(Scope.Benchmark)
public static class Input {
@Param({"24", "36", "72", "128", "256", "512"})
public int size;
@Param({"2"})
public int delta;
int count = 100000;
String longLatin1;
String shortLatin1;
String longUTF16FirstChar;
String shortUTF16FirstChar;
String longUTF16LastChar;
String shortUTF16LastChar;
/**
* Initialize. New array objects and set initial values.
*/
@Setup(Level.Trial)
public void setup() throws Exception {
char[] strsrc = new char[size + delta];
// generate ASCII string
for (int i = 0; i < size + delta; i++) {
strsrc[i] = (char) ('a' + (i % 26));
}
longLatin1 = new String(strsrc);
shortLatin1 = longLatin1.substring(0, size);
longUTF16LastChar = longLatin1.substring(0, longLatin1.length() - 1) + '\ubeef';
longUTF16FirstChar = '\ubeef' + longLatin1.substring(1, longLatin1.length());
shortUTF16LastChar = shortLatin1.substring(0, shortLatin1.length() - 1) + '\ubeef';
shortUTF16FirstChar = longUTF16FirstChar.substring(0, size);
}
}
private int runCompareTo(String str2, String str1) {
return str1.compareTo(str2);
}
/**
* latin1-latin1
*/
@Benchmark
public void compareToLL(Input in, Blackhole blackhole) {
int res = 0;
for (int i = 0; i < in.count; ++i) {
res += runCompareTo(in.longLatin1, in.shortLatin1);
}
blackhole.consume(res);
}
/**
* UTF16-UTF16
*/
@Benchmark
public void compareToUU(Input in, Blackhole blackhole) {
int res = 0;
for (int i = 0; i < in.count; ++i) {
res += runCompareTo(in.longUTF16FirstChar, in.shortUTF16FirstChar);
}
blackhole.consume(res);
}
/**
* latin1-UTF16
*/
@Benchmark
public void compareToLU(Input in, Blackhole blackhole) {
int res = 0;
for (int i = 0; i < in.count; ++i) {
res += runCompareTo(in.longUTF16LastChar, in.shortLatin1);
}
blackhole.consume(res);
}
/**
* UTF16-latin1
*/
@Benchmark
public void compareToUL(Input in, Blackhole blackhole) {
int res = 0;
for (int i = 0; i < in.count; ++i) {
res += runCompareTo(in.longLatin1, in.shortUTF16LastChar);
}
blackhole.consume(res);
}
}