RFR: 8302163: Speed up various String comparison methods with ArraysSupport.mismatch

Claes Redestad redestad at openjdk.org
Mon Feb 13 10:12:15 UTC 2023


On Mon, 13 Feb 2023 09:59:24 GMT, Claes Redestad <redestad at 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


More information about the core-libs-dev mailing list