测试代码

package hello.test;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.Arrays;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
public class BenchmarkTest {

    public static final String[] BRAND_ARRAY = {"iphone", "huawei", "xiaomi", "samsung", "vivo", "bbk", "oppo", "meizu", "sony", "xperia", "htc", "oneplus", "smartisan", "lenovo", "gionee", "nubia", "letv", "vertu"};

    private static final String bidRequestModel = "oneplus";

    @Benchmark
    public static String findBidrequstBrandByStream() {
        final String lowBidRequestModel = bidRequestModel.toLowerCase();
        return Arrays.stream(BRAND_ARRAY).filter(x -> lowBidRequestModel.contains(x)).findAny().get();
    }

    @Benchmark
    public static String findBidrequstBrandByParallelStream() {
        final String lowBidRequestModel = bidRequestModel.toLowerCase();
        return Arrays.stream(BRAND_ARRAY).parallel().filter(x -> lowBidRequestModel.contains(x)).findAny().get();
    }

    @Benchmark
    public static String findBidrequstBrandByArray() {
        final String lowBidRequestModel = bidRequestModel.toLowerCase();
        for (String e : BRAND_ARRAY) {
            if (lowBidRequestModel.contains(e)) {
                return e;
            }
        }
        return "";
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(BenchmarkTest.class.getSimpleName())
                .forks(1)
                .warmupIterations(5)
                .measurementIterations(5)
                .build();
        new Runner(opt).run();
    }
}

结果


Benchmark                                          Mode  Cnt      Score      Error   Units
BenchmarkTest.findBidrequstBrandByArray           thrpt    5  11206.177 ± 1438.816  ops/ms
BenchmarkTest.findBidrequstBrandByParallelStream  thrpt    5    206.097 ±   95.776  ops/ms
BenchmarkTest.findBidrequstBrandByStream          thrpt    5   4838.695 ±  368.454  ops/ms

总结

  • 对性能敏感的程序, 建议还是用回传统的for循环
  • 并行流并不一定会比顺序流快
  • java 8 的流式api, 一般情况下比不上传统的 for 循环