[aarch64-port-dev ] 回复:RFR: 8149733: AArch64: refactorchar_array_equals/byte_array_equals/string_equals
Hui Shi
hui.shi at linaro.org
Wed Feb 24 13:02:48 UTC 2016
Thanks Andrew! Your comment looks really better and performance doesn't
change when run JMHSample_97_ArrayEqual.java
<http://cr.openjdk.java.net/~hshi/8149733/webrev2/JMHSample_97_ArrayEqual.java>
test.
latest webrev http://cr.openjdk.java.net/~hshi/8149733/webrev3/
several small name and format issues:
1. "ary1" -> "a" in method declaration
2. Use tmp1 instead of rscratch1 directly
+ ldrw(cnt1, Address(a1, length_offset));
+ ldrw(cnt2, Address(a2, length_offset));
+ eorw(rscratch1, cnt1, cnt2);
+ cbnzw(rscratch1, DONE);
3. Blank after “!”
+ if (! is_string) {
Following is result with Aleksey's updated test case (-w 5 -wi 3 -i3 -r
10), first 4 group are for base run with base string length 0, 8, 31, 1024.
Performance with patch doesn't show same improvement with early test. Only
small length string equal tests still show obvious improvement.
grep -A 6 "^Benchmark" base.result
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 0 500 avgt 9 15.563 ?
0.005 us/op
JMH_ArrayEquals.byte_not_equal 0 500 avgt 9 16.425 ?
0.167 us/op
JMH_ArrayEquals.char_equal 0 500 avgt 9 15.635 ?
0.294 us/op
JMH_ArrayEquals.char_not_equal 0 500 avgt 9 15.557 ?
0.377 us/op
JMH_ArrayEquals.string_equal 0 500 avgt 9 22.307 ?
0.063 us/op
JMH_ArrayEquals.string_not_equal 0 500 avgt 9 21.368 ?
0.025 us/op
--
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 8 500 avgt 9 16.058 ?
0.012 us/op
JMH_ArrayEquals.byte_not_equal 8 500 avgt 9 16.910 ?
0.574 us/op
JMH_ArrayEquals.char_equal 8 500 avgt 9 17.094 ?
0.008 us/op
JMH_ArrayEquals.char_not_equal 8 500 avgt 9 17.114 ?
0.156 us/op
JMH_ArrayEquals.string_equal 8 500 avgt 9 25.033 ?
0.074 us/op
JMH_ArrayEquals.string_not_equal 8 500 avgt 9 24.968 ?
0.244 us/op
--
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 31 500 avgt 9 18.821 ?
0.091 us/op
JMH_ArrayEquals.byte_not_equal 31 500 avgt 9 19.763 ?
0.002 us/op
JMH_ArrayEquals.char_equal 31 500 avgt 9 24.210 ?
0.033 us/op
JMH_ArrayEquals.char_not_equal 31 500 avgt 9 27.400 ?
0.382 us/op
JMH_ArrayEquals.string_equal 31 500 avgt 9 29.825 ?
0.098 us/op
JMH_ArrayEquals.string_not_equal 31 500 avgt 9 31.918 ?
0.100 us/op
--
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 1024 500 avgt 9 188.613
? 7.386 us/op
JMH_ArrayEquals.byte_not_equal 1024 500 avgt 9 193.399
? 4.448 us/op
JMH_ArrayEquals.char_equal 1024 500 avgt 9 316.324
? 9.976 us/op
JMH_ArrayEquals.char_not_equal 1024 500 avgt 9 341.307
? 1.082 us/op
JMH_ArrayEquals.string_equal 1024 500 avgt 9 324.059
? 2.352 us/op
JMH_ArrayEquals.string_not_equal 1024 500 avgt 9 326.954
? 1.121 us/op
grep -A 6 "^Benchmark" opt.result
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 0 500 avgt 9 15.923 ?
0.132 us/op
JMH_ArrayEquals.byte_not_equal 0 500 avgt 9 15.996 ?
0.336 us/op
JMH_ArrayEquals.char_equal 0 500 avgt 9 16.001 ?
0.127 us/op
JMH_ArrayEquals.char_not_equal 0 500 avgt 9 15.361 ?
0.004 us/op
JMH_ArrayEquals.string_equal 0 500 avgt 9 21.083 ?
0.337 us/op
JMH_ArrayEquals.string_not_equal 0 500 avgt 9 19.887 ?
0.479 us/op
--
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 8 500 avgt 9 16.574 ?
0.148 us/op
JMH_ArrayEquals.byte_not_equal 8 500 avgt 9 16.596 ?
0.719 us/op
JMH_ArrayEquals.char_equal 8 500 avgt 9 17.874 ?
0.431 us/op
JMH_ArrayEquals.char_not_equal 8 500 avgt 9 17.831 ?
0.284 us/op
JMH_ArrayEquals.string_equal 8 500 avgt 9 24.279 ?
0.033 us/op
JMH_ArrayEquals.string_not_equal 8 500 avgt 9 22.850 ?
0.444 us/op
--
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 31 500 avgt 9 19.010 ?
0.006 us/op
JMH_ArrayEquals.byte_not_equal 31 500 avgt 9 19.962 ?
0.071 us/op
JMH_ArrayEquals.char_equal 31 500 avgt 9 25.038 ?
0.108 us/op
JMH_ArrayEquals.char_not_equal 31 500 avgt 9 27.268 ?
0.063 us/op
JMH_ArrayEquals.string_equal 31 500 avgt 9 29.366 ?
0.103 us/op
JMH_ArrayEquals.string_not_equal 31 500 avgt 9 31.357 ?
0.047 us/op
--
Benchmark (baselength) (size) Mode Cnt Score
Error Units
JMH_ArrayEquals.byte_equal 1024 500 avgt 9 190.034
? 4.067 us/op
JMH_ArrayEquals.byte_not_equal 1024 500 avgt 9 192.504
? 4.675 us/op
JMH_ArrayEquals.char_equal 1024 500 avgt 9 313.925
? 8.476 us/op
JMH_ArrayEquals.char_not_equal 1024 500 avgt 9 342.520
? 7.915 us/op
JMH_ArrayEquals.string_equal 1024 500 avgt 9 326.392
? 2.009 us/op
JMH_ArrayEquals.string_not_equal 1024 500 avgt 9 328.526
? 3.617 us/op
Regards
Hui
On 24 February 2016 at 00:17, Andrew Haley <aph at redhat.com> wrote:
> My version is at
>
> http://cr.openjdk.java.net/~aph/8149733/
>
> The changes I made are:
>
> I rewrote most of the comments because I couldn't understand
> them. I intend no criticism, and I understand that English
> isn't the language of your birth. Please tell me if you can
> understand my comments.
>
> "generic_array_equals" -> "arrays_equals"
> Reason: it's not generic, it's only bytes and chars.
> Also, this is what x86_64 calls the same routine.
>
> "ary1" -> "a"
> Reason: "ary" just looks odd. Also, these are the names in the
> java code.
>
> "cmp; br.nz" -> "eor, bnz"
> Reason: Don't clobber flags for no reason.
>
> There's no need to check for the same arrays if we're
> comparing strings.
>
> Otherwise, the code is the same. I haven't much tested this, but it
> should give the same performance. Please test it, and tell me if I've
> broken anything.
>
> Thanks,
>
> Andrew.
>
More information about the aarch64-port-dev
mailing list