On Mon, 13 Feb 2023 09:59:24 GMT, Claes Redestad <redes...@openjdk.org> wrote:

> We can improve various String methods such as `startsWith`, `endsWith` and 
> `regionMatches` by leveraging the intrinsified mismatch methods in 
> `ArraysSupport`.

Microbenchmarking shows decent improvements on small data, scaling up to some 
impressive gains on large inputs when vectorization kicks in (~41x on 
regionMatches for size = 1024 on my x64 sandybridge setup, ~34x on m1 in the 
same config)

macosx-aarch64, m1, 21-b9:

Benchmark                             (size)  (utf16)  Mode  Cnt     Score    
Error  Units
StringComparisons.endsWith                 6     true  avgt   15     5,949 ±  
0,051  ns/op
StringComparisons.endsWith                 6    false  avgt   15     4,063 ±  
0,038  ns/op
StringComparisons.endsWith                15     true  avgt   15    10,758 ±  
0,132  ns/op
StringComparisons.endsWith                15    false  avgt   15     6,487 ±  
0,052  ns/op
StringComparisons.endsWith              1024     true  avgt   15   653,750 ±  
2,835  ns/op
StringComparisons.endsWith              1024    false  avgt   15   314,219 ±  
1,264  ns/op
StringComparisons.regionMatches            6     true  avgt   15    12,460 ±  
0,043  ns/op
StringComparisons.regionMatches            6    false  avgt   15     6,647 ±  
0,026  ns/op
StringComparisons.regionMatches           15     true  avgt   15    30,502 ±  
0,193  ns/op
StringComparisons.regionMatches           15    false  avgt   15    15,073 ±  
0,030  ns/op
StringComparisons.regionMatches         1024     true  avgt   15  2147,480 ±  
4,622  ns/op
StringComparisons.regionMatches         1024    false  avgt   15  1068,787 ± 
14,098  ns/op
StringComparisons.regionMatchesCI          6     true  avgt   15    11,680 ±  
0,106  ns/op
StringComparisons.regionMatchesCI          6    false  avgt   15     4,577 ±  
0,101  ns/op
StringComparisons.regionMatchesCI         15     true  avgt   15    14,422 ±  
0,132  ns/op
StringComparisons.regionMatchesCI         15    false  avgt   15     6,904 ±  
0,124  ns/op
StringComparisons.regionMatchesCI       1024     true  avgt   15   273,810 ±  
3,446  ns/op
StringComparisons.regionMatchesCI       1024    false  avgt   15   226,040 ±  
2,886  ns/op
StringComparisons.regionMatchesRange       6     true  avgt   15    11,896 ±  
0,110  ns/op
StringComparisons.regionMatchesRange       6    false  avgt   15     6,044 ±  
0,034  ns/op
StringComparisons.regionMatchesRange      15     true  avgt   15    29,508 ±  
0,093  ns/op
StringComparisons.regionMatchesRange      15    false  avgt   15    14,336 ±  
0,020  ns/op
StringComparisons.regionMatchesRange    1024     true  avgt   15  2187,600 ± 
80,285  ns/op
StringComparisons.regionMatchesRange    1024    false  avgt   15  1105,813 ± 
28,260  ns/op
StringComparisons.startsWith               6     true  avgt   15     5,315 ±  
0,087  ns/op
StringComparisons.startsWith               6    false  avgt   15     3,588 ±  
0,020  ns/op
StringComparisons.startsWith              15     true  avgt   15     9,823 ±  
0,144  ns/op
StringComparisons.startsWith              15    false  avgt   15     5,963 ±  
0,253  ns/op
StringComparisons.startsWith            1024     true  avgt   15   441,854 ±  
9,295  ns/op
StringComparisons.startsWith            1024    false  avgt   15   224,386 ±  
6,876  ns/op


macosx-aarch64. m1, patched:

Benchmark                             (size)  (utf16)  Mode  Cnt    Score    
Error  Units
StringComparisons.endsWith                 6     true  avgt   15    3,185 ±  
0,063  ns/op
StringComparisons.endsWith                 6    false  avgt   15    4,507 ±  
0,447  ns/op
StringComparisons.endsWith                15     true  avgt   15    6,097 ±  
0,142  ns/op
StringComparisons.endsWith                15    false  avgt   15    5,736 ±  
0,025  ns/op
StringComparisons.endsWith              1024     true  avgt   15   60,283 ±  
4,109  ns/op
StringComparisons.endsWith              1024    false  avgt   15   31,011 ±  
0,080  ns/op
StringComparisons.regionMatches            6     true  avgt   15    3,993 ±  
0,063  ns/op
StringComparisons.regionMatches            6    false  avgt   15    4,836 ±  
0,474  ns/op
StringComparisons.regionMatches           15     true  avgt   15    3,641 ±  
0,012  ns/op
StringComparisons.regionMatches           15    false  avgt   15    2,849 ±  
0,065  ns/op
StringComparisons.regionMatches         1024     true  avgt   15   57,739 ±  
0,748  ns/op
StringComparisons.regionMatches         1024    false  avgt   15   30,943 ±  
0,423  ns/op
StringComparisons.regionMatchesCI          6     true  avgt   15   11,729 ±  
0,142  ns/op
StringComparisons.regionMatchesCI          6    false  avgt   15    4,562 ±  
0,125  ns/op
StringComparisons.regionMatchesCI         15     true  avgt   15   14,611 ±  
0,227  ns/op
StringComparisons.regionMatchesCI         15    false  avgt   15    6,970 ±  
0,083  ns/op
StringComparisons.regionMatchesCI       1024     true  avgt   15  273,476 ±  
1,789  ns/op
StringComparisons.regionMatchesCI       1024    false  avgt   15  227,503 ±  
3,547  ns/op
StringComparisons.regionMatchesRange       6     true  avgt   15    3,485 ±  
0,035  ns/op
StringComparisons.regionMatchesRange       6    false  avgt   15    4,640 ±  
0,050  ns/op
StringComparisons.regionMatchesRange      15     true  avgt   15    6,121 ±  
0,087  ns/op
StringComparisons.regionMatchesRange      15    false  avgt   15    5,784 ±  
0,080  ns/op
StringComparisons.regionMatchesRange    1024     true  avgt   15   58,403 ±  
0,876  ns/op
StringComparisons.regionMatchesRange    1024    false  avgt   15   36,500 ± 
11,264  ns/op
StringComparisons.startsWith               6     true  avgt   15    3,225 ±  
0,255  ns/op
StringComparisons.startsWith               6    false  avgt   15    4,577 ±  
0,684  ns/op
StringComparisons.startsWith              15     true  avgt   15    7,586 ±  
4,402  ns/op
StringComparisons.startsWith              15    false  avgt   15    6,295 ±  
1,402  ns/op
StringComparisons.startsWith            1024     true  avgt   15   76,536 ± 
16,461  ns/op
StringComparisons.startsWith            1024    false  avgt   15   30,523 ±  
0,359  ns/op


linux-x64 sandybridge, 21-b9:

Benchmark                             (size)  (utf16)  Mode  Cnt     Score    
Error  Units
StringComparisons.endsWith                 6     true  avgt   15    12.382 ±  
0.014  ns/op
StringComparisons.endsWith                 6    false  avgt   15     9.975 ±  
0.012  ns/op
StringComparisons.endsWith                15     true  avgt   15    18.679 ±  
0.028  ns/op
StringComparisons.endsWith                15    false  avgt   15    13.133 ±  
0.116  ns/op
StringComparisons.endsWith              1024     true  avgt   15   819.007 ±  
5.523  ns/op
StringComparisons.endsWith              1024    false  avgt   15   415.061 ±  
0.962  ns/op
StringComparisons.regionMatches            6     true  avgt   15    17.363 ±  
0.155  ns/op
StringComparisons.regionMatches            6    false  avgt   15    10.722 ±  
0.072  ns/op
StringComparisons.regionMatches           15     true  avgt   15    37.202 ±  
0.321  ns/op
StringComparisons.regionMatches           15    false  avgt   15    21.128 ±  
0.164  ns/op
StringComparisons.regionMatches         1024     true  avgt   15  2265.847 ±  
2.668  ns/op
StringComparisons.regionMatches         1024    false  avgt   15  1305.184 ± 
11.794  ns/op
StringComparisons.regionMatchesCI          6     true  avgt   15    24.403 ±  
0.367  ns/op
StringComparisons.regionMatchesCI          6    false  avgt   15     9.521 ±  
0.015  ns/op
StringComparisons.regionMatchesCI         15     true  avgt   15    27.650 ±  
0.033  ns/op
StringComparisons.regionMatchesCI         15    false  avgt   15    12.082 ±  
0.130  ns/op
StringComparisons.regionMatchesCI       1024     true  avgt   15   514.851 ±  
5.818  ns/op
StringComparisons.regionMatchesCI       1024    false  avgt   15   351.532 ±  
4.147  ns/op
StringComparisons.regionMatchesRange       6     true  avgt   15    18.227 ±  
0.017  ns/op
StringComparisons.regionMatchesRange       6    false  avgt   15    10.128 ±  
0.015  ns/op
StringComparisons.regionMatchesRange      15     true  avgt   15    40.924 ±  
0.305  ns/op
StringComparisons.regionMatchesRange      15    false  avgt   15    20.476 ±  
0.177  ns/op
StringComparisons.regionMatchesRange    1024     true  avgt   15  2267.800 ±  
3.280  ns/op
StringComparisons.regionMatchesRange    1024    false  avgt   15  1139.950 ±  
1.222  ns/op
StringComparisons.startsWith               6     true  avgt   15    10.095 ±  
0.044  ns/op
StringComparisons.startsWith               6    false  avgt   15     8.908 ±  
0.319  ns/op
StringComparisons.startsWith              15     true  avgt   15    16.406 ±  
0.017  ns/op
StringComparisons.startsWith              15    false  avgt   15    10.964 ±  
0.077  ns/op
StringComparisons.startsWith            1024     true  avgt   15   670.043 ±  
5.107  ns/op
StringComparisons.startsWith            1024    false  avgt   15   346.972 ±  
0.373  ns/op


linux-x64 sandybridge, patched:

Benchmark                             (size)  (utf16)  Mode  Cnt    Score   
Error  Units
StringComparisons.endsWith                 6     true  avgt   15    8.439 ± 
0.010  ns/op
StringComparisons.endsWith                 6    false  avgt   15   11.341 ± 
0.125  ns/op
StringComparisons.endsWith                15     true  avgt   15   10.932 ± 
0.135  ns/op
StringComparisons.endsWith                15    false  avgt   15   10.704 ± 
0.143  ns/op
StringComparisons.endsWith              1024     true  avgt   15   69.427 ± 
7.376  ns/op
StringComparisons.endsWith              1024    false  avgt   15   40.248 ± 
0.661  ns/op
StringComparisons.regionMatches            6     true  avgt   15    8.397 ± 
0.010  ns/op
StringComparisons.regionMatches            6    false  avgt   15    9.813 ± 
0.064  ns/op
StringComparisons.regionMatches           15     true  avgt   15    8.468 ± 
0.105  ns/op
StringComparisons.regionMatches           15    false  avgt   15    8.082 ± 
0.181  ns/op
StringComparisons.regionMatches         1024     true  avgt   15   64.316 ± 
0.643  ns/op
StringComparisons.regionMatches         1024    false  avgt   15   31.500 ± 
0.483  ns/op
StringComparisons.regionMatchesCI          6     true  avgt   15   24.199 ± 
0.017  ns/op
StringComparisons.regionMatchesCI          6    false  avgt   15    9.521 ± 
0.009  ns/op
StringComparisons.regionMatchesCI         15     true  avgt   15   27.656 ± 
0.037  ns/op
StringComparisons.regionMatchesCI         15    false  avgt   15   12.047 ± 
0.019  ns/op
StringComparisons.regionMatchesCI       1024     true  avgt   15  513.828 ± 
4.221  ns/op
StringComparisons.regionMatchesCI       1024    false  avgt   15  349.885 ± 
0.455  ns/op
StringComparisons.regionMatchesRange       6     true  avgt   15    9.771 ± 
0.215  ns/op
StringComparisons.regionMatchesRange       6    false  avgt   15   10.190 ± 
0.012  ns/op
StringComparisons.regionMatchesRange      15     true  avgt   15   11.352 ± 
0.267  ns/op
StringComparisons.regionMatchesRange      15    false  avgt   15   10.617 ± 
0.012  ns/op
StringComparisons.regionMatchesRange    1024     true  avgt   15   66.727 ± 
2.732  ns/op
StringComparisons.regionMatchesRange    1024    false  avgt   15   43.148 ± 
7.262  ns/op
StringComparisons.startsWith               6     true  avgt   15    8.525 ± 
0.010  ns/op
StringComparisons.startsWith               6    false  avgt   15    8.792 ± 
0.025  ns/op
StringComparisons.startsWith              15     true  avgt   15   10.600 ± 
0.564  ns/op
StringComparisons.startsWith              15    false  avgt   15   10.538 ± 
0.645  ns/op
StringComparisons.startsWith            1024     true  avgt   15   61.118 ± 
5.143  ns/op
StringComparisons.startsWith            1024    false  avgt   15   40.171 ± 
0.576  ns/op

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

PR: https://git.openjdk.org/jdk/pull/12528

Reply via email to