[aarch64-port-dev ] 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
>
>
More information about the aarch64-port-dev
mailing list