首页 > 解决方案 > List 与 Set 的流性能差异

问题描述

anyMatch在以下流中,这两者之间会有什么显着的表现吗?

        List<Integer> list = List.of(1, 2, 3, 4);
        Set<Integer> set = Set.of(1, 2, 3, 4);

        var result1 = list.stream().anyMatch(i -> (i % 2 == 0));
        var result2 = set.stream().anyMatch(i -> (i % 2 == 0));

我试图测量它,但 1M 执行的结果有大约 30milis 的差异,所以它可能是测量错误。

标签: javajava-stream

解决方案


There is no significant difference. I just benchmarked it with jmh (OpenJDK 17):

@BenchmarkMode(Mode.AverageTime)
@State(Scope.Benchmark)
public class SetListBenchmark {

    private List<Integer> list;
    private Set<Integer> set;

    @Setup
    public void setUp() {
        list = List.copyOf(generateIntList());
        set = Set.copyOf(generateIntList());
    }

    private List<Integer> generateIntList() {
        var list =  IntStream.range(1, 1_000_000)
                .filter(i -> i % 2 != 0)
                .boxed()
                .collect(Collectors.toList());
        list.add(4);
        return list;
    }

    @Benchmark
    public boolean measureList() {
        return list.stream().anyMatch(i -> i % 2 == 0);
    }

    @Benchmark
    public boolean measureSet() {
        return set.stream().anyMatch(i -> i % 2 == 0);
    }
}

Result:

Benchmark                     Mode  Cnt  Score    Error  Units
SetListBenchmark.measureList  avgt    5  0.001 ±  0.001   s/op
SetListBenchmark.measureSet   avgt    5  0.001 ±  0.001   s/op

推荐阅读