RFR: 8268229: Aarch64: Use Neon in intrinsics for String.equals [v3]
Wang Huang
whuang at openjdk.java.net
Fri Jul 2 09:54:32 UTC 2021
> Dear all,
> Could you give me a favor to review this patch? It improves the performance of the intrinsic of `String.equals` on Neon backend of Aarch64.
> We profile the performance by using this JMH case:
>
>
> ```java
> package com.huawei.string;
> import java.util.*;
> import java.util.concurrent.TimeUnit;
>
> import org.openjdk.jmh.annotations.CompilerControl;
> import org.openjdk.jmh.annotations.Benchmark;
> import org.openjdk.jmh.annotations.Level;
> import org.openjdk.jmh.annotations.OutputTimeUnit;
> import org.openjdk.jmh.annotations.Param;
> import org.openjdk.jmh.annotations.Scope;
> import org.openjdk.jmh.annotations.Setup;
> import org.openjdk.jmh.annotations.State;
> import org.openjdk.jmh.annotations.Fork;
> import org.openjdk.jmh.infra.Blackhole;
>
> @State(Scope.Thread)
> @OutputTimeUnit(TimeUnit.MILLISECONDS)
> public class StringEqual {
> @Param({"8", "64", "4096"})
> int size;
>
> String str1;
> String str2;
>
> @Setup(Level.Trial)
> public void init() {
> str1 = newString(size, 'c', '1');
> str2 = newString(size, 'c', '2');
> }
>
> public String newString(int length, char charToFill, char lastChar) {
> if (length > 0) {
> char[] array = new char[length];
> Arrays.fill(array, charToFill);
> array[length - 1] = lastChar;
> return new String(array);
> }
> return "";
> }
>
> @Benchmark
> @CompilerControl(CompilerControl.Mode.DONT_INLINE)
> public boolean EqualString() {
> return str1.equals(str2);
> }
> }
>
> ```
> The result is list as following:(Linux aarch64 with 128cores)
>
> Benchmark | (size) | Mode | Cnt | Score | Error | Units
> ----------------------------------|-------|---------|-------|------------|------------|----------
> StringEqual.EqualString | 8 | thrpt | 10 | 123971.994 | ± 1462.131 | ops/ms
> StringEqual.EqualString | 64 | thrpt | 10 | 56009.960 | ± 999.734 | ops/ms
> StringEqual.EqualString | 4096 | thrpt | 10 | 1943.852 | ± 8.159 | ops/ms
> StringEqual.EqualStringWithNEON | 8 | thrpt | 10 | 120319.271 | ± 1392.185 | ops/ms
> StringEqual.EqualStringWithNEON | 64 | thrpt | 10 | 72914.767 | ± 1814.173 | ops/ms
> StringEqual.EqualStringWithNEON | 4096 | thrpt | 10 | 2579.155 | ± 15.589 | ops/ms
>
> Yours,
> WANG Huang
Wang Huang has updated the pull request incrementally with one additional commit since the last revision:
unroll when small string sizes
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/4423/files
- new: https://git.openjdk.java.net/jdk/pull/4423/files/4f02c00f..7957ee28
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=4423&range=02
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=4423&range=01-02
Stats: 161 lines in 3 files changed: 34 ins; 48 del; 79 mod
Patch: https://git.openjdk.java.net/jdk/pull/4423.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/4423/head:pull/4423
PR: https://git.openjdk.java.net/jdk/pull/4423
More information about the hotspot-dev
mailing list