RFR: 8254082: AbstractStringBuilder.insert(int dstOffset, CharSequence s, int start, int end) is missing fast-path for String [v4]
Сергей Цыпанов
github.com+10835776+stsypanov at openjdk.java.net
Sun Nov 29 17:33:14 UTC 2020
On Sun, 29 Nov 2020 01:21:08 GMT, Claes Redestad <redestad at openjdk.org> 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
More information about the core-libs-dev
mailing list