当前位置: 首页 > 图灵资讯 > 技术篇> 如何利用并行化提升 Java 函数性能?

如何利用并行化提升 Java 函数性能?

来源:图灵教育
时间:2024-08-27 13:22:48

通过并行化 java 对于庞大的数据集或耗时计算,函数可以显著提高性能。java 8 的并行流 api 允许轻松并行处理数据:创建并行流,使用它 parallel() 方法。并行操作采用并行流执行,如 reduce()。优化示例:并行化素数检查可缩短执行时间。性能比较:并行版比顺序版快得多。最佳实践:识别并行机会,限制并行性,监控并行性。

如何利用并行化提升 Java 函数性能?

如何利用并行化提升 Java 函数性能?

简介

并行化可以显著改善处理庞大数据集或执行耗时的计算 Java 函数的性能。Java 8 并行流被引入 API,使开发人员能够轻松并行处理数据,从而充分利用多核处理器。

基本概念

立即学习“Java免费学习笔记(深入);

并行流是一种可以并行处理的数据流。它使用底层 Fork/Join 该框架将任务分解成较小的子任务,并在多个线程上执行。

使用并行流

你可以使用 parallel() 创建并行流的方法。它回到一个 Stream,这种流量可以并行操作。例如:

List<Integer> numbers = ...;
long sum = numbers.stream()
                  .parallel()
                  .reduce(0, Integer::sum);

该代码将使用并行流计算列表 numbers 中数字的总和。

实战案例

让我们考虑计算素数的函数:

public static List<Integer> calculatePrimes(int n) {
    List<Integer> primes = new ArrayList<>();
    for (int i = 2; i <= n; i++) {
        if (isPrime(i)) {
            primes.add(i);
        }
    }
    return primes;
}

private static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

通过并行处理每个素数检查,我们可以提高函数的性能:

public static List<Integer> calculatePrimesParallel(int n) {
    return IntStream.rangeClosed(2, n)
                    .parallel()
                    .filter(Primes::isPrime)
                    .boxed()
                    .toList();
}

使用这个函数并行流和使用 isPrime 该方法用作过滤器来过滤素数。

性能对比

使用 JMH 基准测试工具,我们可以比较这两种方法的性能:

Benchmark                          (n)  Mode  Cnt   Score   Error  Units
calculatePrimes.perf                 100  avgt    5  10.368 ± 0.152  ms/op
calculatePrimesParallel.perf          100  avgt    5   2.176 ± 0.013  ms/op

正如你所看到的,并行版本显然更快,因为它使用并行处理显著缩短了执行时间。

最佳实践

  • 识别并行化机会:确定哪些操作可以分为并行任务。
  • 并行使用:使用 parallel() 并行处理创建并行流的方法。
  • 限制并行性:根据可用处理器的数量设置适当的并行性水平。
  • 并行性能监控:利用性能探测工具确定并行化的影响并进行优化。

以上是如何利用并行化升级 Java 函数性能?详情请关注图灵教育的其他相关文章!