On Sun, 29 Nov 2020 01:21:08 GMT, Claes Redestad <[email protected]> wrote:
>> Here are the results, looks like we have no regression:
>> Benchmark (intValue) Mode Cnt
>> original patched Units Units
>> StringConcat.concat4String 4711 avgt 15 27.267 ±
>> 1.231 29.938 ± 1.099 ns/op ns/op
>> StringConcat.concat6String 4711 avgt 15 39.185 ±
>> 1.604 42.759 ± 2.564 ns/op ns/op
>> StringConcat.concatConst2String 4711 avgt 15 22.345 ±
>> 1.685 21.913 ± 1.716 ns/op ns/op
>> StringConcat.concatConst4String 4711 avgt 15 32.318 ±
>> 4.073 32.847 ± 1.082 ns/op ns/op
>> StringConcat.concatConst6Object 4711 avgt 15 9.227 ±
>> 0.146 9.999 ± 0.939 ns/op ns/op
>> StringConcat.concatConst6String 4711 avgt 15 46.134 ±
>> 2.729 44.903 ± 1.960 ns/op ns/op
>> StringConcat.concatConstBoolByte 4711 avgt 15 13.117 ±
>> 0.725 12.575 ± 0.380 ns/op ns/op
>> StringConcat.concatConstInt 4711 avgt 15 12.230 ±
>> 0.653 11.890 ± 0.556 ns/op ns/op
>> StringConcat.concatConstIntConstInt 4711 avgt 15 18.152 ±
>> 1.317 17.722 ± 0.566 ns/op ns/op
>> StringConcat.concatConstString 4711 avgt 15 12.644 ±
>> 0.656 13.424 ± 1.400 ns/op ns/op
>> StringConcat.concatConstStringConstInt 4711 avgt 15 20.836 ±
>> 0.703 19.975 ± 0.821 ns/op ns/op
>> StringConcat.concatEmptyConstInt 4711 avgt 15 10.604 ±
>> 0.443 10.229 ± 0.219 ns/op ns/op
>> StringConcat.concatEmptyConstString 4711 avgt 15 4.844 ±
>> 0.174 4.721 ± 0.147 ns/op ns/op
>> StringConcat.concatEmptyLeft 4711 avgt 15 5.386 ±
>> 0.190 5.314 ± 0.104 ns/op ns/op
>> StringConcat.concatEmptyRight 4711 avgt 15 5.352 ±
>> 0.471 5.484 ± 0.354 ns/op ns/op
>> StringConcat.concatMethodConstString 4711 avgt 15 11.887 ±
>> 0.560 14.025 ± 1.522 ns/op ns/op
>> StringConcat.concatMix4String 4711 avgt 15 172.425 ±
>> 6.868 169.658 ± 8.440 ns/op ns/op
>
> Right.
>
> I won't insist but I think some of these could warrant some extra runs and
> analysis of the disassembly just to make sure. E.g. `concatMethodConstString`
> and `concat6String` has regression with just barely non-overlapping errors.
> If these regressions persist it could be due the small difference in the code
> path (one extra call depth for `getBytes(byte[], int, byte)`) causing some
> difference in compilation order, inlining decision or otherwise.
>
> If the regression is real, the paranoid workaround would be to restore
> `String.getBytes(byte[], int, byte)` and not use delegation. A tiny bit of
> code duplication might be preferable to a surprise regression in code that
> has seen a lot of tuning work..
Looks like you are right: delegation caused tiny regression (I've rerun the
benchmark in 10 forks) which is missing from the case with no delegation (third
column):
Benchmark (intValue) Mode Cnt original
patched no delegate Units
StringConcat.concat4String 4711 avgt 100 26.400 ± 0.092
28.278 ± 0.046 26.245 ± 0.045 ns/op
StringConcat.concat6String 4711 avgt 100 37.846 ± 0.219
40.054 ± 0.150 37.857 ± 0.175 ns/op
StringConcat.concatConst2String 4711 avgt 100 18.732 ± 0.125
19.600 ± 0.153 18.598 ± 0.178 ns/op
StringConcat.concatConst4String 4711 avgt 100 29.303 ± 0.165
31.085 ± 0.086 29.246 ± 0.194 ns/op
StringConcat.concatConst6Object 4711 avgt 100 9.107 ± 0.164
8.948 ± 0.010 8.964 ± 0.059 ns/op
StringConcat.concatConst6String 4711 avgt 100 40.441 ± 0.111
41.037 ± 0.052 40.503 ± 0.352 ns/op
StringConcat.concatConstBoolByte 4711 avgt 100 11.934 ± 0.054
12.173 ± 0.197 11.904 ± 0.026 ns/op
StringConcat.concatConstInt 4711 avgt 100 10.968 ± 0.024
11.041 ± 0.034 10.956 ± 0.006 ns/op
StringConcat.concatConstIntConstInt 4711 avgt 100 16.853 ± 0.070
16.958 ± 0.064 16.932 ± 0.070 ns/op
StringConcat.concatConstString 4711 avgt 100 11.440 ± 0.113
12.049 ± 0.116 11.485 ± 0.116 ns/op
StringConcat.concatConstStringConstInt 4711 avgt 100 18.205 ± 0.068
18.612 ± 0.043 18.146 ± 0.065 ns/op
StringConcat.concatEmptyConstInt 4711 avgt 100 9.733 ± 0.121
9.742 ± 0.250 9.592 ± 0.011 ns/op
StringConcat.concatEmptyConstString 4711 avgt 100 4.601 ± 0.054
4.589 ± 0.030 4.579 ± 0.023 ns/op
StringConcat.concatEmptyLeft 4711 avgt 100 5.088 ± 0.031
5.109 ± 0.040 5.119 ± 0.059 ns/op
StringConcat.concatEmptyRight 4711 avgt 100 4.896 ± 0.038
4.876 ± 0.059 4.844 ± 0.025 ns/op
StringConcat.concatMethodConstString 4711 avgt 100 11.561 ± 0.157
12.126 ± 0.148 11.580 ± 0.162 ns/op
StringConcat.concatMix4String 4711 avgt 100 156.119 ± 0.675
154.814 ± 0.169 155.655 ± 1.741 ns/op
So I've dropped delegation and restored `String.getBytes(byte[], int, byte)`
-------------
PR: https://git.openjdk.java.net/jdk/pull/402