gpt4 book ai didi

java - 对单个进程集体使用多个线程

转载 作者:行者123 更新时间:2023-11-30 07:46:44 25 4
gpt4 key购买 nike

我有一个我写的阶乘程序作为基准测试,单线程计算100万的阶乘需要3分钟。我很好奇是否可以将多个线程分配给同一个算法,不是同时运行,而是共同运行,从而提高处理速度并减少运行算法所需的时间。我假设这是可能的,因为 super 计算机有很多线程,而且通常是平均 CPU 频率。

最佳答案

正如 Alex 所提到的,这个问题很容易传播到多个线程。

让我们看一下使用 Java8 流的单线程实现:

Stream<BigInteger> numbers = LongStream.rangeClosed(1, 1_000_000).mapToObj(BigInteger::valueOf);
BigInteger reduced = numbers.reduce(BigInteger.ONE, BigInteger::multiply);

现在让我们看一下它的多线程版本:

Stream<BigInteger> numbers = LongStream.rangeClosed(1, 1_000_000).mapToObj(BigInteger::valueOf);
numbers = numbers.parallel();
BigInteger reduced = numbers.reduce(BigInteger.ONE, BigInteger::multiply);

(是的,唯一的区别是 numbers = numbers.parallel(); - 流的美妙之处)

第二个比第一个快很多(取决于您拥有的真实和超线程 CPU 的数量),但得到相同的结果。


由于某些我还不能完全解释的原因,并行版本比非并行版本快很多。它可能与内存使用有关。在我的 4 核 2.5Ghz i7 MacBook Pro 上,使用并行版本计算需要 5.8 秒,但非并行版本即使在 10 分钟内也无法完成(100 万)。

对于 100,000,并行版本要快得多:并行版本为 90 毫秒,非并行版本为 2500 毫秒(在 9 次预热迭代后测量的第 10 次迭代)。

关于java - 对单个进程集体使用多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com