RFR: 8336856: Optimize String Concat [v28]

Shaojin Wen duke at openjdk.org
Sun Aug 4 16:25:39 UTC 2024


On Sun, 4 Aug 2024 16:09:08 GMT, Shaojin Wen <duke at openjdk.org> wrote:

>> This PR implements the same algorithm as the current generateMHInlineCopy based on bytecode to improve startup performance.
>
> Shaojin Wen has updated the pull request incrementally with 11 additional commits since the last revision:
> 
>  - 1. split length & coder & prepend method
>    2. fix comment
>    3. change forceInlineThreshold to 16
>    4. 1 arg use built-in method
>    5. add tests
>  - Extract an erasedArgs method
>  - Remove unnecessary operations
>  - copyright
>  - typo
>  - bug fix and make clean
>  - Code structuring to reduce the size of generated code
>  - forceinline
>  - use prepend and split lengthcoder
>  - Revert "use static method, remove ConcatBase & MethodHandlePair & CONSTRUCTOR_BUILDER"
>    
>    This reverts commit 03d0c3e6d638a94b29000da510e3b69abdbbe240.
>  - ... and 1 more: https://git.openjdk.org/jdk/compare/a3cd822e...937f4117

[StringConcat13.txt](https://github.com/user-attachments/files/16488239/StringConcat13.txt)

The version of 937f4117162efc869d6dd0a2ff7465fb2071895c has achieved the same performance as the version using MethodHandle, and is significantly ahead in startup performance.

Below are the performance numbers on the MacBook M1 Pro


# prepend last version 
git chekcout 937f4117162efc869d6dd0a2ff7465fb2071895c

# baseline
make test TEST="micro:java.lang.StringConcat" MICRO="VM_OPTIONS=-Djava.lang.invoke.StringConcat.highArityThreshold=20"

# bytecode
make test TEST="micro:java.lang.StringConcat" MICRO="VM_OPTIONS=-Djava.lang.invoke.StringConcat.highArityThreshold=0"


|   | baseline  | bytecode | delta |
| --- | --- | --- | --- |
| StringConcat.concat123String | 1226.402 | 1064.982 | 15.16% |
| StringConcat.concat13String | 45.690 | 44.908 | 1.74% |
| StringConcat.concat13StringConst | 71.923 | 65.761 | 9.37% |
| StringConcat.concat23String | 136.207 | 136.542 | -0.25% |
| StringConcat.concat23StringConst | 115.112 | 115.689 | -0.50% |
| StringConcat.concat30Mix | 404.258 | 411.780 | -1.83% |
| StringConcat.concat3String | 12.529 | 12.657 | -1.01% |
| StringConcat.concat4String | 13.950 | 23.398 | -40.38% |
| StringConcat.concat6String | 19.983 | 18.363 | 8.82% |
| StringConcat.concatConst2String | 9.783 | 7.974 | 22.69% |
| StringConcat.concatConst4String | 14.783 | 22.698 | -34.87% |
| StringConcat.concatConst6Object | 51.522 | 47.578 | 8.29% |
| StringConcat.concatConst6String | 19.563 | 18.592 | 5.22% |
| StringConcat.concatConstBool | 3.432 | 3.435 | -0.09% |
| StringConcat.concatConstBoolByte | 6.465 | 6.172 | 4.75% |
| StringConcat.concatConstBoolString | 7.234 | 7.846 | -7.80% |
| StringConcat.concatConstBoolean | 3.970 | 3.953 | 0.43% |
| StringConcat.concatConstBooleanConst | 4.870 | 4.860 | 0.21% |
| StringConcat.concatConstBooleanString | 7.429 | 8.589 | -13.51% |
| StringConcat.concatConstFloat | 56.911 | 53.658 | 6.06% |
| StringConcat.concatConstFloatConst | 54.156 | 53.585 | 1.07% |
| StringConcat.concatConstFloatString | 59.664 | 60.519 | -1.41% |
| StringConcat.concatConstInt | 6.075 | 6.074 | 0.02% |
| StringConcat.concatConstIntConst | 6.880 | 6.436 | 6.90% |
| StringConcat.concatConstIntConstInt | 9.748 | 9.955 | -2.08% |
| StringConcat.concatConstIntString | 14.359 | 10.480 | 37.01% |
| StringConcat.concatConstInteger | 3.997 | 3.981 | 0.40% |
| StringConcat.concatConstIntegerConst | 4.763 | 4.750 | 0.27% |
| StringConcat.concatConstIntegerString | 6.973 | 7.789 | -10.48% |
| StringConcat.concatConstObjectConst | 11.078 | 10.961 | 1.07% |
| StringConcat.concatConstString | 4.976 | 4.960 | 0.32% |
| StringConcat.concatConstStringConst | 8.101 | 6.161 | 31.49% |
| StringConcat.concatConstStringConstInt | 11.896 | 27.647 | -56.97% |
| StringConcat.concatEmptyConstInt | 5.604 | 5.667 | -1.11% |
| StringConcat.concatEmptyConstString | 2.058 | 2.084 | -1.25% |
| StringConcat.concatEmptyLeft | 2.212 | 2.244 | -1.43% |
| StringConcat.concatEmptyRight | 2.327 | 2.369 | -1.77% |
| StringConcat.concatMethodConstString | 4.969 | 5.030 | -1.21% |
| StringConcat.concatMix4String | 81.670 | 75.552 | 8.10% |
| StringConcat.concatStringBoolString | 19.159 | 8.492 | 125.61% |
| StringConcat.concatStringBooleanString | 9.847 | 8.492 | 15.96% |
| StringConcat.concatStringIntString | 18.228 | 15.132 | 20.46% |
| StringConcat.concatStringIntegerString | 9.097 | 8.528 | 6.67% |
| StringConcatStartup.MixedLarge.run | 321.940 | 152.246 | 111.46% |
| StringConcatStartup.MixedSmall.run | 29.818 | 7.609 | 291.88% |
| StringConcatStartup.StringLarge.run | 93.671 | 31.292 | 199.34% |
| StringConcatStartup.StringSingle.constBool | 3.110 | 0.465 | 568.82% |
| StringConcatStartup.StringSingle.constBoolString | 0.231 | 0.744 | -68.95% |
| StringConcatStartup.StringSingle.constBoolean | 0.120 | 0.145 | -17.24% |
| StringConcatStartup.StringSingle.constBooleanString | 3.549 | 0.996 | 256.33% |
| StringConcatStartup.StringSingle.constFloat | 3.800 | 0.601 | 532.28% |
| StringConcatStartup.StringSingle.constFloatString | 5.741 | 1.237 | 364.11% |
| StringConcatStartup.StringSingle.constInt | 3.004 | 0.465 | 546.02% |
| StringConcatStartup.StringSingle.constIntString | 0.146 | 0.119 | 22.69% |
| StringConcatStartup.StringSingle.constInteger | 0.121 | 0.143 | -15.38% |
| StringConcatStartup.StringSingle.constIntegerString | 3.585 | 0.996 | 259.94% |
| StringConcatStartup.StringSingle.constString | 0.116 | 0.141 | -17.73% |
| StringConcatStartup.StringThree.stringIntString | 7.000 | 1.552 | 351.03% |
| StringConcatStartup.StringThree.stringIntegerString | 6.530 | 1.070 | 510.28% |

-------------

PR Comment: https://git.openjdk.org/jdk/pull/20273#issuecomment-2267596390


More information about the core-libs-dev mailing list