java - 为什么并行流比顺序流慢?

标签 java java-8 java-stream

我有两个函数可以解决同一问题。 第一个使用顺序流,第二个使用并行流。

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/

相关文章:

java - 有没有一种优雅的方法可以将 Map<P, Optional<Q>> 转换为稀疏 Map<P, Q>?

java - 确认 oauth2 批准流程后,service/oauth/authorize 中的主体为空(approveR Deny 中的 http post)

java - 为什么 list.sort 不使用 Optional API

java - 使用 JEST 客户端在 ElasticSearch 中的节点之间切换

java - 如何使用 Java 8 streaming api 从 map 列表创建 map map

java - Java中Streams的正确使用

java - 将 List<CustomerOrder> 分组到 Map<Gender, Money>

java - v-> v>5 的解释

java - EVAL_BODY_AGAIN、SKIP_BODY 和 EVAL_BODY_INCLUDE 的目的是什么

c# - 为什么 Java 和 C# 在 oops 上不同?