我有两个函数可以解决同一问题。 第一个使用顺序流,第二个使用并行流。
public static int digitalRoot(int n) {
int sum = String.valueOf(n).chars().map(i -> Integer.parseInt(String.valueOf((char) i))).sum();
if (sum >= 10) {
return digitalRoot(sum);
} else {
return sum;
}
}
public static int digitalRootParallel(int n) {
int sum = String.valueOf(n).chars().parallel().
map(i -> Integer.parseInt(String.valueOf((char) i))).sum();
if (sum >= 10) {
return digitalRootParallel(sum);
} else {
return sum;
}
}
我执行了这些函数一次。 并行函数digitalRootParallel()比顺序函数(32 ms)digitalRoot()更快。
但是当我在 1.000.000 的循环中执行它们中的每一个时,顺序(117 毫秒)比并行(1124 毫秒)更快。
for (int i = 0; i < 1000000; i++) {
sum = digitalRoot(n);
}
为什么并行流的循环速度较慢?
最佳答案
我能分享的是我对你除了并行版本的减速之外没有测量到任何东西感到惊讶。 Fork/Join 几乎不需要做任何工作:只需解析并求和最多十位数字。 F/J 可能会认为甚至不值得拆分它,并将在单个线程上执行整个计算,但其中涉及的开销会抑制性能。
如果您想看到并行化的任何好处,请确保您有至少半秒的顺序计算时间,并且可以轻松地将其拆分为子任务。
关于java - 为什么并行流比顺序流慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28475622/