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