Scala是否独立完成了并行工作?

Scala是否独立完成了并行工作?,scala,collections,parallel-processing,Scala,Collections,Parallel Processing,我有一个创建迷宫的小程序。它使用大量集合(默认变量,不可变,或至少用作不可变的集合) 该程序计算出30个尺寸不断增加的迷宫。使用a进行(1到30)以上的理解 由于最新版本的并行集合框架已经面世,我想尝试一下,希望能获得一些性能提升 这失败了,当我进行一点调查时,我发现: 在没有任何远程并行调用的情况下运行时,我的机器的4个内核中的每一个都显示了大约30%的处理器负载 >P>当我用(1到30)替换范围1到30时,PAR CPU负载上升到所有内核的80%左右(我预期)。迷宫完成的顺序或多或少是随机的

我有一个创建迷宫的小程序。它使用大量集合(默认变量,不可变,或至少用作不可变的集合)

该程序计算出30个尺寸不断增加的迷宫。使用a进行(1到30)以上的理解

由于最新版本的并行集合框架已经面世,我想尝试一下,希望能获得一些性能提升

这失败了,当我进行一点调查时,我发现:

  • 在没有任何远程并行调用的情况下运行时,我的机器的4个内核中的每一个都显示了大约30%的处理器负载

  • >P>当我用(1到30)替换范围1到30时,PAR CPU负载上升到所有内核的80%左右(我预期)。迷宫完成的顺序或多或少是随机的(这是我预期的)。所有迷宫的总时间保持不变

  • 用并行计数器部件替换一些内部使用的集合似乎确实产生了效果

  • 我现在有两个问题:

    • 为什么我有所有的4个核心旋转,虽然没有任何东西是并行运行的

    • 无论是否并行运行,程序仍然需要相同时间的可能原因是什么。除了CPU周期外,没有明显的其他瓶颈(没有IO、没有网络、通过-Xmx设置有大量内存)


    有什么想法吗?

    每个核心30%的版本只是一个糟糕的调度程序(听起来像Windows 7),它会频繁地将进程从一个核心迁移到另一个核心。对于您的流程,每个核心(1/4)可能接近25%,加上其他其他负载的30%。如果在Linux下运行相同的示例,您可能会看到一个内核被绑定

    当您转换为
    (1到30).par
    时,您开始在所有内核中真正使用线程,但分配如此少量的工作然后收集结果的同步开销抵消了并行性的提高。你需要把你的工作分成更大的独立部分


    编辑:如果1..30中的每一个都代表了更大的工作量(比如说解决一个迷宫),那么如果每个工作单元大致相同,那么自动并行将工作得更好。想象一下你有29个简单的迷宫和一个非常非常困难的迷宫。第30迷宫仍将与其他所有迷宫一起连续运行(或非常接近)。如果迷宫的复杂度随着数量的增加而增加,请尝试按
    30到1乘-1的顺序生成迷宫,这样最大的任务就会排在第一位。可以把它看作是背包问题的一个死板的解决方案。

    您应该制作一个不超过一页的示例并编译。否则,这只是太多的猜测。唯一可以在不执行任何操作的情况下并发运行的是垃圾收集器。您的程序是否创建了很多对象,这些对象在创建后很快就会被垃圾收集?这在函数式编程风格中非常常见……是的,我想确实创建了很多对象,所以GC可能是一个很好的候选者。我会激活一些日志记录,看看会有什么结果。我确实觉得我没有获得任何性能提升,因为我正在等待GCIt的Windows 7。我不知道我是否能找到一个linux来测试你的理论。较大的迷宫(尺寸大于20)每个需要1秒或更长时间。因此,小语块理论似乎并不适用。