Hi Ivan,
On 12/11/2016 10:03 PM, Ivan Gerasimov wrote:
Thank you Peter for the suggestion!
An alternative to a new virtual method on Appendable (or maybe a
complement to it) could be a special internal CharSequence
implementation (CharRepetitions) with a static factory method on
CharSequence like the following:
I think it's a clever idea!
Though it might be harder to implement the special optimized handling
of such sequences by Appendable implementations outside java.lang.
You are right. But even without such optimization, appending of such
sequence is still faster than appending a solid String although slower
than optimized appendN().
http://cr.openjdk.java.net/~plevart/jdk9-dev/8170348_Appendable.appendN.alt/webrev.01/
Together with special-case optimization in
AbstractStringBuilder.append(CharSequence) it can perform equally
well when JITed. I took your benchmark and modified it a bit:
http://cr.openjdk.java.net/~plevart/jdk9-dev/8170348_Appendable.appendN.alt/AppendNTest.java
...I moved sb.setLength(0) into a special @Setup method so that it
doesn't cause the remaining tested code to be over-optimized. You can
try just this change in your benchmark and you'll notice a difference.
Actually, in the benchmark I tried to follow the suggestions found here:
http://hg.openjdk.java.net/code-tools/jmh/file/ef24f1b5de08/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_38_PerInvokeSetup.java
Note, how the Level.Invocation setup is avoided in the measureRight
benchmark.
Ups, I missed that comment on Level.Invocation. I suspected that
something was not right since the results were so different (appending
seemed much slower)....
So here are the results with sb.setLength(0) moved back to benchmark
methods:
Benchmark (size) Mode Cnt Score Error Units
AppendNTest.test_0_New 0 avgt 10 2.380 ± 0.081 ns/op
AppendNTest.test_0_New 1 avgt 10 4.323 ± 0.139 ns/op
AppendNTest.test_0_New 5 avgt 10 9.233 ± 0.859 ns/op
AppendNTest.test_0_New 10 avgt 10 8.977 ± 0.577 ns/op
AppendNTest.test_0_New 20 avgt 10 9.454 ± 0.157 ns/op
AppendNTest.test_1_Old 0 avgt 10 2.262 ± 0.282 ns/op
AppendNTest.test_1_Old 1 avgt 10 4.534 ± 0.037 ns/op
AppendNTest.test_1_Old 5 avgt 10 15.798 ± 0.734 ns/op
AppendNTest.test_1_Old 10 avgt 10 29.086 ± 0.757 ns/op
AppendNTest.test_1_Old 20 avgt 10 56.417 ± 6.240 ns/op
AppendNTest.test_2_Solid 0 avgt 10 6.124 ± 0.112 ns/op
AppendNTest.test_2_Solid 1 avgt 10 10.305 ± 0.084 ns/op
AppendNTest.test_2_Solid 5 avgt 10 10.599 ± 0.109 ns/op
AppendNTest.test_2_Solid 10 avgt 10 11.574 ± 0.716 ns/op
AppendNTest.test_2_Solid 20 avgt 10 11.646 ± 0.878 ns/op
AppendNTest.test_3_Repeat 0 avgt 10 2.514 ± 0.187 ns/op
AppendNTest.test_3_Repeat 1 avgt 10 4.457 ± 0.096 ns/op
AppendNTest.test_3_Repeat 5 avgt 10 7.744 ± 0.295 ns/op
AppendNTest.test_3_Repeat 10 avgt 10 9.523 ± 1.507 ns/op
AppendNTest.test_3_Repeat 20 avgt 10 9.195 ± 0.009 ns/op
Still comparable.
Regards, Peter
With kind regards,
Ivan