RFR: 8325169: Reduce String::indexOf overheads [v2]

Claes Redestad redestad at openjdk.org
Sat Feb 3 14:22:01 UTC 2024


On Fri, 2 Feb 2024 20:53:14 GMT, Claes Redestad <redestad at openjdk.org> wrote:

>> This patch streamlines and specializes various `String::indexOf` methods. Mainly avoids the need for clamping and doing checks that are redundant in almost all cases, moving the checks to the API boundary where they are needed. 
>> 
>> This improves performance both at peak and during startup/warmup. Since indexOf is heavily used in bootstrapping code it makes sense to slightly dial back abstraction and delegation, which in this case also brought some benefit to peak performance.
>> 
>> Testing: tier1-3
>
> Claes Redestad has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Add comment about preconditions

Updated to clamp `fromIndex` to `value.length >> coder` since the intrinsic might silently deoptimize if passed a `fromIndex` value that's out of bounds.

This correctness fix dials back the speed-up on some of the `indexOf(c, offset)` micros, but not by much:

Name                                               Cnt   Base   Error    Test   Error  Unit  Change
StringIndexOf.searchChar16LongSuccess             5/25 14,909 ± 3,284  14,351 ± 0,105 ns/op   1,04x (p = 0,218 )
StringIndexOf.searchChar16LongWithOffsetSuccess   5/25 14,715 ± 0,870  14,098 ± 0,015 ns/op   1,04x (p = 0,004*)
StringIndexOf.searchChar16MediumSuccess           5/25  6,611 ± 0,016   6,488 ± 0,025 ns/op   1,02x (p = 0,000*)
StringIndexOf.searchChar16MediumWithOffsetSuccess 5/25  7,151 ± 0,026   7,064 ± 0,021 ns/op   1,01x (p = 0,000*)
StringIndexOf.searchChar16ShortSuccess            5/25  2,667 ± 0,007   2,362 ± 0,002 ns/op   1,13x (p = 0,000*)
StringIndexOf.searchChar16ShortWithOffsetSuccess  5/25  2,494 ± 0,112   2,543 ± 0,008 ns/op   0,98x (p = 0,018 )
StringIndexOf.searchCharLongSuccess               5/25  5,995 ± 0,017   5,270 ± 0,005 ns/op   1,14x (p = 0,000*)
StringIndexOf.searchCharLongWithOffsetSuccess     5/25  6,377 ± 0,118   6,212 ± 0,003 ns/op   1,03x (p = 0,000*)
StringIndexOf.searchCharMediumSuccess             5/25  2,350 ± 0,013   1,924 ± 0,002 ns/op   1,22x (p = 0,000*)
StringIndexOf.searchCharMediumWithOffsetSuccess   5/25  2,675 ± 0,002   2,581 ± 0,005 ns/op   1,04x (p = 0,000*)
StringIndexOf.searchCharShortSuccess              5/25  1,719 ± 0,002   1,243 ± 0,002 ns/op   1,38x (p = 0,000*)
StringIndexOf.searchCharShortWithOffsetSuccess    5/25  1,635 ± 0,006   1,311 ± 0,001 ns/op   1,25x (p = 0,000*)
  * = significant

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

PR Comment: https://git.openjdk.org/jdk/pull/17685#issuecomment-1925339945


More information about the core-libs-dev mailing list