RFR: 8268231: Aarch64: Use ldp in intrinsics for String.compareTo [v5]

Wu Yan wuyan at openjdk.java.net
Thu Aug 5 02:43:37 UTC 2021


On Tue, 3 Aug 2021 13:33:07 GMT, Wang Huang <whuang at openjdk.org> wrote:

>> Dear all, 
>>     Can you do me a favor to review this patch. This patch use `ldp` to implement String.compareTo.
>>    
>> * We add a JMH test case 
>> * Here is the result of this test case
>>  
>> Benchmark	                       |(size)| Mode| Cnt|Score | Error	 |Units	
>> ---------------------------------|------|-----|----|------|--------|-----
>> StringCompare.compareLL       |  64  | avgt| 5  |7.992 | ±	0.005|us/op
>> StringCompare.compareLL       |  72  | avgt| 5  |15.029| ±	0.006|us/op
>> StringCompare.compareLL       |  80  | avgt| 5  |14.655| ±	0.011|us/op
>> StringCompare.compareLL       |  91  | avgt| 5  |16.363| ±	0.12 |us/op
>> StringCompare.compareLL       |  101 | avgt| 5  |16.966| ±	0.007|us/op
>> StringCompare.compareLL       |  121 | avgt| 5  |19.276| ±	0.006|us/op
>> StringCompare.compareLL       |  181 | avgt| 5  |19.002| ±	0.417|us/op
>> StringCompare.compareLL       |  256 | avgt| 5  |24.707| ±	0.041|us/op
>> StringCompare.compareLLWithLdp|  64  | avgt| 5  |8.001	| ±	0.121|us/op
>> StringCompare.compareLLWithLdp|  72  | avgt| 5  |11.573| ±	0.003|us/op
>> StringCompare.compareLLWithLdp|  80  | avgt| 5  |6.861 | ±	0.004|us/op
>> StringCompare.compareLLWithLdp|  91  | avgt| 5  |12.774| ±	0.201|us/op
>> StringCompare.compareLLWithLdp|  101 | avgt| 5  |8.691 | ±	0.004|us/op
>> StringCompare.compareLLWithLdp|  121 | avgt| 5  |11.091| ±	1.342|us/op
>> StringCompare.compareLLWithLdp|  181 | avgt| 5  |14.64 | ±	0.581|us/op
>> StringCompare.compareLLWithLdp|  256 | avgt| 5  |25.879| ±	1.775|us/op
>> StringCompare.compareUU       |  64  | avgt| 5  |13.476| ±	0.01 |us/op
>> StringCompare.compareUU       |  72  | avgt| 5  |15.078| ±	0.006|us/op
>> StringCompare.compareUU       |  80  | avgt| 5  |23.512| ±	0.011|us/op
>> StringCompare.compareUU       |  91  | avgt| 5  |24.284| ±	0.008|us/op
>> StringCompare.compareUU       |  101 | avgt| 5  |20.707| ±	0.017|us/op
>> StringCompare.compareUU       |  121 | avgt| 5  |29.302| ±	0.011|us/op
>> StringCompare.compareUU       |  181 | avgt| 5  |39.31	| ±	0.016|us/op
>> StringCompare.compareUU       |  256 | avgt| 5  |54.592| ±	0.392|us/op
>> StringCompare.compareUUWithLdp|  64  | avgt| 5  |16.389| ±	0.008|us/op
>> StringCompare.compareUUWithLdp|  72  | avgt| 5  |10.71 | ±	0.158|us/op
>> StringCompare.compareUUWithLdp|  80  | avgt| 5  |11.488| ±	0.024|us/op
>> StringCompare.compareUUWithLdp|  91  | avgt| 5  |13.412| ±	0.006|us/op
>> StringCompare.compareUUWithLdp|  101 | avgt| 5  |16.245| ±	0.434|us/op
>> StringCompare.compareUUWithLdp|  121 | avgt| 5  |16.597| ±	0.016|us/op
>> StringCompare.compareUUWithLdp|  181 | avgt| 5  |27.373| ±	0.017|us/op
>> StringCompare.compareUUWithLdp|  256 | avgt| 5  |41.74 | ±	3.5	 |us/op
>> 
>> From this table, we can see that in most cases, our patch is better than old one.
>> 
>> Thank you for your review. Any suggestions are welcome.
>
> Wang Huang has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains six additional commits since the last revision:
> 
>  - fix bugs
>  - Merge branch 'master' of https://gitee.com/ustc-wh/jdk into JDK-8268231
>  - fix style and add unalign test case
>  - refact codes
>  - draft of refactor
>  - 8268231: Aarch64: Use ldp in intrinsics for String.compareTo

We also tested this version on Hisilicon, increasing the count of each test and the length of the string because the test data fluctuates more. When diff_pos is greater than 255, the improvement will be more obvious. And in all cases there was no significant decline.


base:
Benchmark                                     (diff_pos)  (size)  Mode  Cnt   Score   Error  Units
StringCompare.compareLLDiffStrings                     7     512  avgt   50   5.481 ? 1.230  us/op
StringCompare.compareLLDiffStrings                    31     512  avgt   50   6.944 ? 0.962  us/op
StringCompare.compareLLDiffStrings                    63     512  avgt   50  10.129 ? 0.973  us/op
StringCompare.compareLLDiffStrings                   127     512  avgt   50  15.944 ? 0.786  us/op
StringCompare.compareLLDiffStrings                   255     512  avgt   50  28.233 ? 0.737  us/op
StringCompare.compareLLDiffStrings                   511     512  avgt   50  51.612 ? 1.357  us/op
StringCompare.compareUUDiffStrings                     7     512  avgt   50   5.552 ? 0.809  us/op
StringCompare.compareUUDiffStrings                    31     512  avgt   50  12.024 ? 1.499  us/op
StringCompare.compareUUDiffStrings                    63     512  avgt   50  15.368 ? 0.009  us/op
StringCompare.compareUUDiffStrings                   127     512  avgt   50  28.354 ? 0.655  us/op
StringCompare.compareUUDiffStrings                   255     512  avgt   50  52.932 ? 0.598  us/op
StringCompare.compareUUDiffStrings                   511     512  avgt   50  99.377 ? 1.194  us/op
StringCompare.compareUUDiffStringsTurnOffCCP           7     512  avgt   50   5.599 ? 0.801  us/op
StringCompare.compareUUDiffStringsTurnOffCCP          31     512  avgt   50  10.200 ? 1.206  us/op
StringCompare.compareUUDiffStringsTurnOffCCP          63     512  avgt   50  15.897 ? 0.783  us/op
StringCompare.compareUUDiffStringsTurnOffCCP         127     512  avgt   50  28.420 ? 0.818  us/op
StringCompare.compareUUDiffStringsTurnOffCCP         255     512  avgt   50  53.377 ? 1.049  us/op
StringCompare.compareUUDiffStringsTurnOffCCP         511     512  avgt   50  98.362 ? 0.889  us/op

opt:
Benchmark                                     (diff_pos)  (size)  Mode  Cnt   Score   Error  Units
StringCompare.compareLLDiffStrings                     7     512  avgt   50   6.338 ? 1.513  us/op
StringCompare.compareLLDiffStrings                    31     512  avgt   50   6.734 ? 0.789  us/op
StringCompare.compareLLDiffStrings                    63     512  avgt   50   9.799 ? 1.757  us/op
StringCompare.compareLLDiffStrings                   127     512  avgt   50  13.954 ? 1.688  us/op
StringCompare.compareLLDiffStrings                   255     512  avgt   50  19.128 ? 1.024  us/op
StringCompare.compareLLDiffStrings                   511     512  avgt   50  38.108 ? 1.595  us/op
StringCompare.compareUUDiffStrings                     7     512  avgt   50   7.327 ? 1.376  us/op
StringCompare.compareUUDiffStrings                    31     512  avgt   50   8.969 ? 1.311  us/op
StringCompare.compareUUDiffStrings                    63     512  avgt   50  13.482 ? 1.623  us/op
StringCompare.compareUUDiffStrings                   127     512  avgt   50  20.602 ? 1.495  us/op
StringCompare.compareUUDiffStrings                   255     512  avgt   50  37.906 ? 3.763  us/op
StringCompare.compareUUDiffStrings                   511     512  avgt   50  72.682 ? 6.374  us/op
StringCompare.compareUUDiffStringsTurnOffCCP           7     512  avgt   50   6.638 ? 1.279  us/op
StringCompare.compareUUDiffStringsTurnOffCCP          31     512  avgt   50   8.044 ? 0.924  us/op
StringCompare.compareUUDiffStringsTurnOffCCP          63     512  avgt   50  12.921 ? 1.540  us/op
StringCompare.compareUUDiffStringsTurnOffCCP         127     512  avgt   50  19.010 ? 1.333  us/op
StringCompare.compareUUDiffStringsTurnOffCCP         255     512  avgt   50  36.326 ? 1.302  us/op
StringCompare.compareUUDiffStringsTurnOffCCP         511     512  avgt   50  75.746 ? 3.786  us/op

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

PR: https://git.openjdk.java.net/jdk/pull/4722


More information about the core-libs-dev mailing list