Java 8 流性能对比。传统集合
您最近涉足 Java 8 并进行了非正式基准测试,以将其 Stream API 与经典集合的性能进行比较。您的测试涉及过滤整数列表、提取偶数的平方根并将结果存储在 Double 列表中。然而,您质疑测试的有效性,并渴望澄清真正的性能影响。
评估基准测试
您的初步结果,表明流比收集慢,引发了担忧。为了确保更可靠的评估,必须解决潜在的错误并进行公平的测试。以下是一些注意事项:
正确的基准测试结果
根据这些建议,让我们重新审视使用 JMH 和改进的基准测试策略进行性能评估:
@OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) @OperationsPerInvocation(StreamVsVanilla.N) public class StreamVsVanilla { public static final int N = 10000; static List<Integer> sourceList = new ArrayList<>(); static { for (int i = 0; i < N; i++) { sourceList.add(i); } } @Benchmark public List<Double> vanilla() { List<Double> result = new ArrayList<>(sourceList.size() / 2 + 1); for (Integer i : sourceList) { if (i % 2 == 0){ result.add(Math.sqrt(i)); } } return result; } @Benchmark public List<Double> stream() { return sourceList.stream() .filter(i -> i % 2 == 0) .map(Math::sqrt) .collect(Collectors.toCollection( () -> new ArrayList<>(sourceList.size() / 2 + 1))); } }
结果:
Benchmark Mode Samples Mean Mean error Units StreamVsVanilla.stream avgt 10 17.588 0.230 ns/op StreamVsVanilla.vanilla avgt 10 10.796 0.063 ns/op
结果
与初步结果,JMH 基准测试清楚地表明,在此特定场景中,传统收集方法明显快于流方法。
结论
基于这些改进的基准测试结果,我们可以得出结论:
以上是对于简单的操作,流总是比传统集合慢吗?的详细内容。更多信息请关注PHP中文网其他相关文章!