【发布时间】:2014-11-10 06:48:35
【问题描述】:
我刚开始学习 Java 中的 Streams 和 parallel,我想知道为什么普通的 for 循环比 IntStreamparalleled 在向数组中添加项时花费的时间更少。
package parallel;
import java.util.stream.IntStream;
public class Parallel {
public static void main(String[] args) {
final int[] intArray = new int[100000];
long startTime = System.currentTimeMillis();
IntStream.range(0, 100000).parallel().forEach(i -> intArray[i]=i);
long endTime = System.currentTimeMillis();
System.out.println("Parallel time: " + (endTime-startTime));
final int[] intArray2 = new int[100000];
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++){
intArray2[i] = i;
}
endTime = System.currentTimeMillis();
System.out.println("Non parallel time: " + (endTime-startTime));
}
}
得到这样的结果。
并行时间:110
非并行时间:7
【问题讨论】:
-
首先,众所周知,基准测试很难准确执行。微基准测试更糟糕,然后就没用了。我会指出,您的数组已经构建完毕,您可以循环并设置一个值,而并行 foreach 没有以预初始化值开始。
-
有两个不同的数组被填充(
intArray和intArray2),所以这两种情况都从一个“干净”的数组开始。 -
问题在于你的测量方法,句号。这种测量方法的最大问题是它打印一个数字,人们很容易将其解释为有意义。它没有。
标签: java benchmarking java-stream