【发布时间】:2014-03-28 03:48:03
【问题描述】:
我想测试 Java8 并行流的速度有多快,所以我编写了一个程序。该程序计算给定数字列表中素数的数量。该程序以这些方式计算素数:
- 使用 for 循环;
- 通过使用 lambda 表达式;
- 通过使用 lambda 表达式(并行流)。
在执行程序之前,我期望并行流版本应该更快。但结果是
在 4237 英里秒内找不到总质数 664579 ----for 循环版本
在 2440 英里秒内找不到总素数 664579 ----并行流
在 2166 英里秒内找不到总素数 664579 ----lambda 表达式
我怀疑为什么并行版本比 lambda 版本慢
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
numbers.add(i);
}
Stopwatch stopwatch = Stopwatch.createStarted();
int counter = 0;
for (int number : numbers) {
if (isPrime(number)) {
counter++;
}
}
stopwatch.stop();
System.out.println("Total prime no found " + counter + " in " + stopwatch.elapsed(TimeUnit.MILLISECONDS) + " mili sec");
stopwatch = Stopwatch.createStarted();
long count1 = numbers.parallelStream().filter(n -> isPrime(n)).count();
stopwatch.stop();
System.out.println("Total prime no found " + count1 + " in " + stopwatch.elapsed(TimeUnit.MILLISECONDS) + " mili sec");
stopwatch = Stopwatch.createStarted();
long count2 = numbers.stream().filter(n -> isPrime(n)).count();
System.out.println("Total prime no found " + count2 + " in " + stopwatch.elapsed(TimeUnit.MILLISECONDS) + " mili sec");
stopwatch.stop();
上述程序使用 google Guava 库计算经过的时间。
【问题讨论】:
-
在进行基准测试时,您还应该注意预热期
-
另外:
count1和count2是相同的... -
我改了,结果不一致
-
在 4178 英里秒内找不到总质数 664579 --loop
在 2597 英里秒内找不到总质数 664579 --并行流
在 4187 英里秒内找不到总质数 664579 --lambda 表达式
在 4198 mili sec 内找不到总质数 664579 --loop
在 4690 mili sec 内找不到总质数 664579 -- 在并行流中
在 4195 mili 内找不到总质数 664579秒 -- 在 lambda 表达式中
在 4252 英里内找不到总质数 664579 秒 --loop
在 2455 英里内找不到总质数 664579 秒 --parallel
在 4555 英里内找不到总质数 664579 sec --lambda 表达式
-
您的基准测试方法有点简单。您应该使用诸如 jmh 之类的框架。
标签: java lambda parallel-processing java-8