【发布时间】:2016-10-09 19:25:11
【问题描述】:
我正在使用一些 Java 8 Stream API。我很困惑地看到以下两种解决方案之间的性能差异,它们只是打印Stream 的内容。
解决方案 1:
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
start = System.nanoTime();
Arrays.stream(array).forEach(System.out::println);
System.out.println((System.nanoTime() - start) / 1000000.0f);
解决方案 2:
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
start = System.nanoTime();
Arrays.stream(array).forEach(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
System.out.println((System.nanoTime() - start) / 1000000.0f);
对于执行,Solution 1 大约需要。比 Solution 2 多 5-6 倍。
系统配置:
- JRE:
1.8.0_101 64 bit - 操作系统:
Windows 10 Home 64-bit - 内存:
4 GB - IDE:
Eclipse Mas-1 for Java EE 64-bit
如果有人能解释一下,为什么会有这么大的差异?
JMH 代码:
public class MyBenchmark {
@Benchmark
public void solution_0() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);asdasdas
}
}
@Benchmark
public void solution_1() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
Arrays.stream(array).forEach(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
}
@Benchmark
public void solution_2() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
Arrays.stream(array).forEach(System.out::println);
}
}
【问题讨论】:
-
你的测量结果如何?您只使用一次运行吗?微基准测试并非易事。您需要预热,丢弃最高和最低值,考虑平均值和标准偏差等
-
在说明哪种方法更快之前,您应该尝试了解一些有关 Java 微基准的知识。搜索 Jmh
-
@FedericoPeraltaSchaffner 我已经考虑了 100 次迭代并跳过了前几个元素,因为它们发生了重大变化。我已经运行了相同的程序 4-5 次,每次结果都是一样的。
-
@SergioOteroLopez 我用 Mode.All 尝试了 JMH,但我只在
ns/op和ops/ns中得到结果。理想情况下,两种算法都应该相同。我找不到任何东西来获得绝对平均时间。
标签: java performance java-8 java-stream consumer