String.indexOf(single-char-String)
Michael Bien
mbien42 at gmail.com
Tue Nov 23 16:06:38 UTC 2021
On 23.11.21 15:57, Roger Riggs wrote:
> Hi Michael,
>
> As you might expect performance of strings is very sensitive and has
> been tuned extensively over the years many times.
>
> Though this improves the performance for 1 character strings. It will
> have an impact on *every other* length of string.
> You'll need to show that it does not impact performance of longer
> strings.
yes of course. The if (str.length == 1) branch should be dead code and
eliminated by the JVM for all String constants with non-one lengths.
Looking through the benchmarks in micro/*/java/lang/String*, all seem to
be using constants as parameter for indexOf(). To try to measure the
impact of the if branch i would have to write a benchmark with a
parameter which changes every iteration, right? Otherwise the branch
will be optimized away by the JIT.
>
> It may be worth looking further at other ways to achieve the result.
agreed, I tried the most obvious approach first, but there is a chance
that the fast path can be put into the intrinsified
StringLatin1/StringUTF16 code instead.
-michael
>
> Regards, Roger
>
>
> On 11/22/21 3:52 PM, Michael Bien wrote:
>> Hello,
>>
>> I kept forgetting which variants of the String methods perform better
>> with single-char-Strings and which with char (IDEs had the tendency
>> to suggest the wrong variant since it changed between JDK releases).
>> So i wrote JMH benchmarks and noticed that the last method with a
>> performance difference seems to be String.indexOf() - all other
>> variants performed equally (unless I overlooked some).
>>
>> this might be fairly easy to fix:
>>
>> https://github.com/openjdk/jdk/pull/6509
>>
>> (side effect: contains("c") is also faster)
>>
>> I haven't looked into the intrinsified code of StringLatin1 and
>> StringUTF16 to check if it could be fixed there (mostly because i
>> actually don't know how the JVM assembles those intrinsics). It might
>> be possible to improve this for short Strings in general, not just
>> for chars, dependent on why the intrinsified version is actually
>> slower for single-char-Strings. I opted for the trivial fix in java
>> code.
>>
>> best regards,
>>
>> michael
>>
>
More information about the core-libs-dev
mailing list