RFR: 8149733: AArch64: refactor char_array_equals/byte_array_equals/string_equals

Hui Shi hui.shi at linaro.org
Mon Feb 22 11:56:25 UTC 2016


Thanks Aleksey & Andrew!

Patch is updated in http://cr.openjdk.java.net/~hshi/8149733/webrev2/ , it
adds on
1. Fix misc spelling and format issues
2. Use cnt2 for array length compare, comment that cnt2 can’t be used after
length compare
3. Add more comments for tail handling

JMH test in
http://cr.openjdk.java.net/~hshi/8149733/webrev2/JMHSample_97_ArrayEqual.java
. Run with java -jar ../benchmarks.jar '.*JMHSample_97*' -w 5 -wi 3 -i 5 -r
10 -f 0

Following is testing result before and after apply this patch. Refactoring
looks better in most cases.

Length 1-8 before
Benchmark                                 Mode  Cnt     Score   Error  Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5  2954.349 ± 0.076  us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5  3232.505 ± 7.050  us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5  2916.643 ± 0.126  us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5  2778.486 ± 3.539  us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5  4411.364 ± 0.149  us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  3898.965 ± 0.122  us/op

Length 1-8 after
Benchmark                                 Mode  Cnt     Score     Error
 Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5  2890.122 ±   1.279
 us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5  2893.002 ±   5.914
 us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5  2735.193 ±   0.096
 us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5  2753.818 ±   0.708
 us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5  4162.080 ± 818.652
 us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  3824.308 ±   0.621
 us/op


Length 9-16 before
Benchmark                                 Mode  Cnt     Score    Error
 Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5  4193.783 ±  22.731
 us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5  3819.967 ±  61.053
 us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5  5780.135 ± 104.966
 us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5  5694.717 ±  87.426
 us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5  6741.276 ±   1.112
 us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  6439.345 ± 161.295
 us/op

Length 9-16 after
Benchmark                                 Mode  Cnt     Score   Error  Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5  2937.688 ± 0.074  us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5  2842.832 ± 0.038  us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5  5274.417 ± 0.912  us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5  4611.007 ± 0.592  us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5  6778.782 ± 28.918
 us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  6455.762 ± 10.674
 us/op

Length 32-39 before
Benchmark                                 Mode  Cnt      Score    Error
 Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5   5519.248 ±  1.799
 us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5   7204.390 ± 72.663
 us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5   7891.681 ±  4.859
 us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5   9830.466 ±  0.800
 us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5  10087.074 ±  1.976
 us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  11383.347 ±  1.712
 us/op

Length 32-39 after
Benchmark                                 Mode  Cnt      Score    Error
 Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5   5445.432 ±  1.396
 us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5   5856.414 ±  0.996
 us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5   7864.556 ±  1.408
 us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5   9274.953 ± 30.892
 us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5   9841.792 ±  0.721
 us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  10750.615 ±  1.252
 us/op

Length 1025-1032 before
Benchmark                                 Mode  Cnt       Score     Error
 Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5  103655.644 ± 15794.521
 us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5   90908.990 ± 120.387
 us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5  155515.192 ± 233.650
 us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5  148312.632 ±  59.342
 us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5  134281.945 ±  20.829
 us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  138580.479 ± 137.336
 us/o

Length 1025-1032 after
Benchmark                                 Mode  Cnt       Score       Error
 Units
JMHSample_97_ArrayEqual.byte_equal        avgt    5  102232.913 ± 1950.542
 us/op
JMHSample_97_ArrayEqual.byte_not_equal    avgt    5   90179.625 ± 102.160
 us/op
JMHSample_97_ArrayEqual.char_equal        avgt    5  152515.169 ±   167.507
 us/op
JMHSample_97_ArrayEqual.char_not_equal    avgt    5  140293.463 ±   198.916
 us/op
JMHSample_97_ArrayEqual.string_equal      avgt    5  141776.676 ±    42.597
 us/op
JMHSample_97_ArrayEqual.string_not_equal  avgt    5  130141.577 ±    29.875
 us/op

Regards
Hui

On 19 February 2016 at 20:36, Aleksey Shipilev <aleksey.shipilev at oracle.com>
wrote:

> Hi Hui,
>
> On 02/19/2016 03:13 PM, Hui Shi wrote:
> > webrev: http://cr.openjdk.java.net/~hshi/8149733/webrev/
> > <http://cr.openjdk.java.net/%7Ehshi/8149733/webrev/>
>
> Not savvy with AArch64 assembly, but it does not look bad.
>
> My other comments are superficial:
>
>  * Desperately needs spell-checking: "implenetaions", "implemenation",
> "eqauls", "comapre"
>
>  * Inconsistent naming, e.g. "... = wordSize/step_size;"
>
>  * "if (is_string_equal == false) {"
>
>  * "if (exact_log >0 )"
>
>  * Shouldn't be:
>
>         4533     ldrw(cnt1, Address(ary1, length_offset));
>         4534     ldrw(tmp2, Address(ary2, length_offset));
>         4535     cmp(cnt1, tmp2);
>
>   spelled like:
>
>         4533 ldrw(cnt1, Address(ary1, length_offset));
>         4534 ldrw(cnt2, Address(ary2, length_offset));
>         4535 cmp(cnt1, cnt2);
>
>  * Would be nice to keep the comments like "// 0-7 bytes left, cnt1 =
> #bytes left - 4"
>
>  * Why TAIL01 block is predicated on (step_size == 1) now?
>
> > Test case: http://cr.openjdk.java.net/~hshi/8149733/TestArrayEqual.java
> > <http://cr.openjdk.java.net/%7Ehshi/8149733/TestArrayEqual.java>
>
> I think you should really, really, really use JMH for these benchmarks:
>  http://openjdk.java.net/projects/code-tools/jmh/
>
> It would also provide you an easy access to generated code profiling,
> with -prof perfasm. It is usually pretty clear from that output if your
> generated code needs even more tuneups.
>
> Cheers,
> -Aleksey
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20160222/974b4b0f/attachment.html>


More information about the hotspot-compiler-dev mailing list