On Wed, 29 Oct 2025 02:00:16 GMT, Xueming Shen <[email protected]> wrote:

>> Experimenting with Arrays.mismatch at the beginning of the array iteration 
>> as 
>> 
>> 
>>         int k = ArraysSupport.mismatch(value, other, lim);
>>         if (k < 0)
>>             return len - olen;
>>         for (; k < lim; k++) {
>>             ....
>>         }
>> 
>> 
>> The benchmark results suggest that it does help 'dramatically' when the 
>> compared strings share with the same prefix.  For example those "UpperLower" 
>> test cases (which shares the same upper cases text prefix. However it is 
>> also relatively expensive, with a 20%-ish overhead when the strings do not 
>> share the same string text but are case-insensitively equals.  I would 
>> suggest let's leave it out for now?
>> 
>> ### With Arrays.mismatch
>> 
>> 
>> Benchmark                                    Mode  Cnt   Score   Error  Units
>> StringCompareToFoldCase.asciiLower           avgt   15  15.044 ± 0.751  ns/op
>> StringCompareToFoldCase.asciiLowerEQ         avgt   15  10.033 ± 0.366  ns/op
>> StringCompareToFoldCase.asciiLowerEQFC       avgt   15  12.094 ± 0.288  ns/op
>> StringCompareToFoldCase.asciiLowerFC         avgt   15  12.513 ± 0.290  ns/op
>> StringCompareToFoldCase.asciiUpperLower      avgt   15  11.716 ± 0.471  ns/op
>> StringCompareToFoldCase.asciiUpperLowerEQ    avgt   15  11.120 ± 0.458  ns/op
>> StringCompareToFoldCase.asciiUpperLowerEQFC  avgt   15   7.544 ± 0.103  ns/op
>> StringCompareToFoldCase.asciiUpperLowerFC    avgt   15   7.384 ± 0.167  ns/op
>> StringCompareToFoldCase.asciiWithDFFC        avgt   15  54.949 ± 1.260  ns/op
>> StringCompareToFoldCase.greekLower           avgt   15  39.492 ± 0.124  ns/op
>> StringCompareToFoldCase.greekLowerEQ         avgt   15  39.266 ± 0.071  ns/op
>> StringCompareToFoldCase.greekLowerEQFC       avgt   15  28.049 ± 0.292  ns/op
>> StringCompareToFoldCase.greekLowerFC         avgt   15  28.272 ± 0.115  ns/op
>> StringCompareToFoldCase.greekUpperLower      avgt   15   7.103 ± 0.052  ns/op
>> StringCompareToFoldCase.greekUpperLowerEQ    avgt   15   7.439 ± 0.079  ns/op
>> StringCompareToFoldCase.greekUpperLowerEQFC  avgt   15   2.716 ± 0.138  ns/op
>> StringCompareToFoldCase.greekUpperLowerFC    avgt   15   2.628 ± 0.051  ns/op
>> StringCompareToFoldCase.latin1UTF16          avgt   15  23.147 ± 0.094  ns/op
>> StringCompareToFoldCase.latin1UTF16EQ        avgt   15  22.626 ± 0.081  ns/op
>> StringCompareToFoldCase.latin1UTF16EQFC      avgt   15  38.453 ± 0.697  ns/op
>> StringCompareToFoldCase.latin1UTF16FC        avgt   15  38.464 ± 0.441  ns/op
>> StringCompareToFoldCase....
>
> ### Long:  packing  1:M-count + 1-3 folding codepoints
> 
> https://cr.openjdk.org/~sherman/casefolding_long/
> 
> The performance is slightly better, but not as good as I would have expected. 
> The access to codepoint from the long looks a little clumsy,  but the logic 
> looks smooth. need more work. opinion?
> 
> 
> Benchmark                                    Mode  Cnt   Score   Error  Units
> StringCompareToFoldCase.asciiLower           avgt   15  15.487 ± 0.298  ns/op
> StringCompareToFoldCase.asciiLowerEQ         avgt   15  10.005 ± 0.368  ns/op
> StringCompareToFoldCase.asciiLowerEQFC       avgt   15  10.755 ± 0.160  ns/op
> StringCompareToFoldCase.asciiLowerFC         avgt   15  10.349 ± 0.155  ns/op
> StringCompareToFoldCase.asciiUpperLower      avgt   15  12.188 ± 0.278  ns/op
> StringCompareToFoldCase.asciiUpperLowerEQ    avgt   15  10.901 ± 0.551  ns/op
> StringCompareToFoldCase.asciiUpperLowerEQFC  avgt   15   9.218 ± 0.165  ns/op
> StringCompareToFoldCase.asciiUpperLowerFC    avgt   15   9.335 ± 0.404  ns/op
> StringCompareToFoldCase.asciiWithDFFC        avgt   15  37.010 ± 0.518  ns/op
> StringCompareToFoldCase.greekLower           avgt   15  39.572 ± 0.098  ns/op
> StringCompareToFoldCase.greekLowerEQ         avgt   15  39.317 ± 0.104  ns/op
> StringCompareToFoldCase.greekLowerEQFC       avgt   15  20.428 ± 0.243  ns/op
> StringCompareToFoldCase.greekLowerFC         avgt   15  19.623 ± 0.141  ns/op
> StringCompareToFoldCase.greekUpperLower      avgt   15   7.105 ± 0.048  ns/op
> StringCompareToFoldCase.greekUpperLowerEQ    avgt   15   7.462 ± 0.092  ns/op
> StringCompareToFoldCase.greekUpperLowerEQFC  avgt   15   6.518 ± 0.128  ns/op
> StringCompareToFoldCase.greekUpperLowerFC    avgt   15   6.593 ± 0.240  ns/op
> StringCompareToFoldCase.latin1UTF16          avgt   15  23.130 ± 0.152  ns/op
> StringCompareToFoldCase.latin1UTF16EQ        avgt   15  22.606 ± 0.089  ns/op
> StringCompareToFoldCase.latin1UTF16EQFC      avgt   15  29.574 ± 0.348  ns/op
> StringCompareToFoldCase.latin1UTF16FC        avgt   15  29.691 ± 0.445  ns/op
> StringCompareToFoldCase.supLower             avgt   15  55.027 ± 0.676  ns/op
> StringCompareToFoldCase.supLowerEQ           avgt   15  55.784 ± 0.368  ns/op
> StringCompareToFoldCase.supLowerEQFC         avgt   15  24.984 ± 0.157  ns/op
> StringCompareToFoldCase.supLowerFC           avgt   15  24.865 ± 0.139  ns/op
> StringCompareToFoldCase.supUpperLower        avgt   15  14.538 ± 0.144  ns/op
> StringCompareToFoldCase.supUpperLowerEQ      avgt   15  14.728 ± 0.206  ns/op
> StringCompareT...

> Experimenting with Arrays.mismatch at the beginning of the array iteration as
> ...
> The benchmark results suggest that it does help 'dramatically' when the 
> compared strings share with the same prefix. For example those "UpperLower" 
> test cases (which shares the same upper cases text prefix. However it is also 
> relatively expensive, with a 20%-ish overhead when the strings do not share 
> the same string text but are case-insensitively equals. I would suggest let's 
> leave it out for now?

> ```
Ok to leave it out for now.  In similar contexts where System.arraycopy or 
Arrays.mismatch has some overhead I've suggested doing a simple check (like 
`size < 8`) to avoid the overhead when the strings/byte arrays are short.
Thanks for checking.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/27628#discussion_r2475377160

Reply via email to