我有一个创建迷宫的小程序。它使用了许多集合(默认变体,它是不可变的,或者至少用作不可变的)。
该程序计算 30 个尺寸增加的迷宫。使用 a for comprehension over (1 to 30)
由于最新版本的并行集合框架可用,我想试一试,希望能获得一些性能提升。
这失败了,当我进行了一些调查时,我发现了以下内容:
我现在有两个问题:
对此有何想法?
最佳答案
每个核心版本 30% 只是一个糟糕的调度程序(听起来像 Windows 7),它非常频繁地将进程从一个核心迁移到另一个核心。对于您的进程,每个内核 (1/4) 可能更接近 25%,再加上其他负载占 30%。如果您在 Linux 下运行相同的示例,您可能会看到一个核心。
当您转换为 (1 to 30).par
时,您开始真正在所有内核上使用线程,但是分配如此少量的工作然后收集结果的同步开销抵消了并行性增益。您需要将您的工作分解为更大的独立块。
编辑:如果 1..30 中的每一个都代表一些更大的工作量(比如解决迷宫),那么如果每个工作单元大致相同,那么自动并行化将工作得更好。想象一下,你有 29 个简单的迷宫和一个非常难的迷宫。第 30 个迷宫仍将与其他所有内容连续(或非常接近)运行)。如果您的迷宫的复杂性随着数量的增加而增加,请尝试按顺序生成它们 30 to 1 by -1
以便最重要的任务先进行。将其视为背包问题的脑残解决方案。
关于scala - Scala 是否可以自己并行执行任何操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270522/