RFR: 7903478: JMH: Use different padding names for B1 and B3 classes to avoid "hiding fields with same name" warnings
Aleksey Shipilev
shade at openjdk.org
Wed May 31 07:42:25 UTC 2023
On Tue, 30 May 2023 13:17:58 GMT, Vladimir Sitnikov <vsitnikov at openjdk.org> wrote:
>> jmh-core/src/main/java/org/openjdk/jmh/generators/core/Paddings.java line 42:
>>
>>> 40: throw new IllegalArgumentException("prefix must not be empty");
>>> 41: }
>>> 42: StringJoiner sj = new StringJoiner("");
>>
>> What's the point of rewriting this to `StringJoiner`? `StringBuilder` optimizations would be nice to have, if available in the JIT.
>
> I doubt `StringBuilder` optimizations are available in JIT since the code uses for-loop and a non-trivial `String.format`. At the same time, `StringJoiner` can estimate the target buffer size before it joins.
> `StringBuilder` have to re-allocate the internal array.
>
> Moving `new StringBuilder()` outside of a loop and using `setLength(0)`
>
>
> @Fork(value = 3, jvmArgsPrepend = {"-Xmx128m"})
> @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
> @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
> @State(Scope.Thread)
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.MICROSECONDS)
>
> String prefix = "b1";
>
> @Benchmark
> public List<String> paddings_list_old() {
> List<String> list = new ArrayList<>();
> for (int p = 0; p < 16; p++) {
> StringBuilder sb = new StringBuilder();
> sb.append(" ");
> sb.append(String.format("byte p%03d", p * 16 + 0));
> for (int q = 1; q < 16; q++) {
> sb.append(String.format(", p%03d", p * 16 + q));
> }
> sb.append(";");
> list.add(sb.toString());
> }
> return list;
> }
>
> @Benchmark
> public List<String> paddings_list_reusedBuilder() {
> List<String> list = new ArrayList<>();
> StringBuilder sb = new StringBuilder();
> for (int p = 0; p < 16; p++) {
> sb.setLength(0);
> sb.append(" ");
> sb.append(String.format("byte p%03d", p * 16 + 0));
> for (int q = 1; q < 16; q++) {
> sb.append(String.format(", p%03d", p * 16 + q));
> }
> sb.append(";");
> list.add(sb.toString());
> }
> return list;
> }
>
> @Benchmark
> public String paddings_str_preallocatedBuilder() {
> StringBuilder sb = new StringBuilder(1680);
> for (int p = 0; p < 16; p++) {
> sb.append(" ");
> sb.append(String.format("byte p%03d", p * 16 + 0));
> for (int q = 1; q < 16; q++) {
> sb.append(String.format(", p%03d", p * 16 + q));
> }
> sb.append(";");
> sb.append(System.lineSeparator());
> }
>
> return sb.toString();
> }
>
> @Benchmark
> public String paddings_str_joiner() {
> String prefix = this.prefix;
> StringJoiner sj = new StringJoiner("");
> for (int p = 0; p < 16; p++) {
> sj.add(" byte ");
> for (int q = 0; q < 16; q++) {
> if (q != 0) {
> sj.add(", ");
> }
> sj.add(prefix);
> sj.add(String.format("%03d", p * 16 + q));
> }
> ...
All right, fine. But you need to pass GHA testing with this patch.
-------------
PR Review Comment: https://git.openjdk.org/jmh/pull/104#discussion_r1211225152
More information about the jmh-dev
mailing list