On Sun, 21 Nov 2021 00:29:46 GMT, Vicente Romero <vrom...@openjdk.org> wrote:
>> Please review this PR which aims to optimize the implementation of the >> `toString` method we provide for records. A benchmark comparing the >> implementation we are providing for records with lombok found out that >> lombok is much faster mainly because our implementation uses >> `String::format`. This fix is basically delegating on >> StringConcatFactory::makeConcatWithConstants which is faster. >> >> TIA >> >> This is the result of the benchmark comparing records to lombok with vanilla >> JDK: >> >> Benchmark Mode Cnt Score Error Units >> MyBenchmark.base avgt 4 0.849 ± 0.111 ns/op >> MyBenchmark.equals_record avgt 4 7.343 ± 2.740 ns/op >> MyBenchmark.equals_value avgt 4 6.644 ± 1.920 ns/op >> MyBenchmark.record_hash_code avgt 4 5.763 ± 3.882 ns/op >> MyBenchmark.record_to_string avgt 4 262.626 ± 12.574 ns/op >> <------ Before >> MyBenchmark.value_class_to_string avgt 4 30.325 ± 21.389 ns/op >> MyBenchmark.value_hash_code avgt 4 5.048 ± 3.936 ns/op >> >> >> after this patch: >> >> Benchmark Mode Cnt Score Error Units >> MyBenchmark.base avgt 4 0.680 ± 0.185 ns/op >> MyBenchmark.equals_record avgt 4 5.599 ± 1.348 ns/op >> MyBenchmark.equals_value avgt 4 5.718 ± 4.633 ns/op >> MyBenchmark.record_hash_code avgt 4 4.628 ± 4.368 ns/op >> MyBenchmark.record_to_string avgt 4 26.791 ± 1.817 ns/op >> <------- After >> MyBenchmark.value_class_to_string avgt 4 35.473 ± 2.626 ns/op >> MyBenchmark.value_hash_code avgt 4 6.152 ± 5.101 ns/op > > Vicente Romero has updated the pull request incrementally with one additional > commit since the last revision: > > setting max split size to 20 Marked as reviewed by jlaskey (Reviewer). src/java.base/share/classes/java/lang/runtime/ObjectMethods.java line 276: > 274: if (i != names.size() - 1) { > 275: constants[1 + 2 * i + 1] = ", "; > 276: } Wondering if it would be cleaner to use a full recipe. StringBuilder recipeSB = new StringBuilder(); recipeSB.append(receiverClass.getSimpleName()); recipeSB.append('['); for (int i = 0; i < names.size(); i++) { if (i != 0) { recipeSB.append(", "); } recipeSB.append(names.get(i)); recipeSB.append('='); recipeSB.append('\1'); } recipeSB.append(']'); String recipe = recipeSB.toString(); ------------- PR: https://git.openjdk.java.net/jdk/pull/6403