如何并行处理列表中的元素以使用 Java 8 Streams 对它们进行求和
How to parallel process elements in an list to sum them all using Java 8 Streams
鉴于加法具有交换律属性,不需要以可序列化的方式对对象求和,例如我们可以按对对元素求和,然后对结果求和,或者对第一部分求和列表,然后是第二个,然后将两个结果相加,以使其更有效。
我正在尝试通过 Java 中的并行处理来做到这一点,但我对 API 还不是很熟悉。
是否可以使用并行流?
这是我开始编写的代码片段,但我不知道如何继续......谢谢
Long result=CollectionUtils.isNotEmpty(accounts)?accounts.stream().parallel().mapToLong(account->account.getBalance))
你问的是map/reduce算法。据我所知,JDK8 中没有通用的 map/reduce,但特定的实现使用它。例如,这将在 parallel/sequential 模式下实现:
Arrays.stream(new int[] { 1, 2}).sum();
并行API源码的阅读对教育很有帮助
是的,这是可能的:
accounts.stream().mapToLong(Account::getBalance).parallel().sum();
与
相同
accounts.stream().mapToLong(Account::getBalance).parallel().reduce(0, (a, b) -> a+b);
请注意:并行执行此操作只有在处理非常大的数字集时才真正开始节省时间。由于并行化开销,在较小的集合上它实际上更慢。由于并行运算符,这段代码的运行速度大约是原来的两倍:
int intCount = 100_000_000;
int x[] = new int[intCount];
Random rand = new Random();
for (int i = 0; i < intCount; i++) {
x[i] = rand.nextInt();
}
long ts = System.currentTimeMillis();
for (int r = 0; r < 100; r++) {
Arrays.stream(x).parallel().sum();
}
System.out.println("Time elapsed: " + (System.currentTimeMillis() - ts));
将 intCount 降低到 1 我可以看到我在我的机器上为并行化支付了大约 5 毫秒(超过 100 次迭代)的开销,这对于几乎什么都不做来说是相当多的时间。
鉴于加法具有交换律属性,不需要以可序列化的方式对对象求和,例如我们可以按对对元素求和,然后对结果求和,或者对第一部分求和列表,然后是第二个,然后将两个结果相加,以使其更有效。 我正在尝试通过 Java 中的并行处理来做到这一点,但我对 API 还不是很熟悉。
是否可以使用并行流?
这是我开始编写的代码片段,但我不知道如何继续......谢谢
Long result=CollectionUtils.isNotEmpty(accounts)?accounts.stream().parallel().mapToLong(account->account.getBalance))
你问的是map/reduce算法。据我所知,JDK8 中没有通用的 map/reduce,但特定的实现使用它。例如,这将在 parallel/sequential 模式下实现:
Arrays.stream(new int[] { 1, 2}).sum();
并行API源码的阅读对教育很有帮助
是的,这是可能的:
accounts.stream().mapToLong(Account::getBalance).parallel().sum();
与
相同accounts.stream().mapToLong(Account::getBalance).parallel().reduce(0, (a, b) -> a+b);
请注意:并行执行此操作只有在处理非常大的数字集时才真正开始节省时间。由于并行化开销,在较小的集合上它实际上更慢。由于并行运算符,这段代码的运行速度大约是原来的两倍:
int intCount = 100_000_000;
int x[] = new int[intCount];
Random rand = new Random();
for (int i = 0; i < intCount; i++) {
x[i] = rand.nextInt();
}
long ts = System.currentTimeMillis();
for (int r = 0; r < 100; r++) {
Arrays.stream(x).parallel().sum();
}
System.out.println("Time elapsed: " + (System.currentTimeMillis() - ts));
将 intCount 降低到 1 我可以看到我在我的机器上为并行化支付了大约 5 毫秒(超过 100 次迭代)的开销,这对于几乎什么都不做来说是相当多的时间。