Perl线程比顺序处理更快?

时间:2011-02-14 07:02:04

标签: perl performance

只是想问一下,并行处理是否比顺序处理更快。 我一直以为并行处理速度更快,所以我做了一个实验。 我对我的脚本进行了基准测试,并在做了一堆

后发现了
sub add{

    for ($x=0; $x<=200000; $x++){
        $data[$x] = $x/($x+2);
    }

}

线程似乎平均减慢约0.5个CPU秒。这是正常的还是顺序处理更快是真的吗?

3 个答案:

答案 0 :(得分:7)

Perl线程非常糟糕。在每种情况下你最好都要求几个过程。

在perl中创建新线程时,它会执行以下操作:

  • 制作副本 - 是的,真实副本 - 范围内的每个perl数据结构,包括属于您未编写的模块的那些
  • 在新的OS线程中启动几乎是一个新的独立的perl实例

如果您想要共享任何内容(因为它现在已经复制了所有内容),您必须使用threads模块中的share函数。这是非常糟糕的,因为它替换了你的变量,带有一些tie()废话,它在它周围添加了太细粒度的锁定以防止并发访问。访问共享变量会导致大量的隐式锁定,并且速度非常慢。

简而言之,perl线程:

  • 花很长时间开始
  • 浪费内存
  • 无论如何都无法有效地共享数据。

使用fork()会更好,除非你在Windows上,否则它不会复制每个变量(内核会写入copy-copy)。

答案 1 :(得分:7)

并行与顺序处理是否更好是高度依赖于任务的,你已经做了正确的事情:你对两者进行了基准测试并确定了你的任务(你进行基准测试的那个,不一定是你真正想做的那个)哪一个更快。

作为一般规则,在单个处理器上,对于受CPU限制的任务,顺序处理往往更好,因为如果您有两个任务,每个任务需要5秒的CPU时间来完成,那么您将需要10秒无论您是按顺序还是并行执行,都会占用CPU时间。因此,设置多个线程/进程不会带来任何好处,但它会产生额外的任务切换开销,同时还会阻止您在所有结果可用之前获得任何结果

多处理器系统上的CPU绑定任务在并行运行时往往会做得更好,前提是它们可以彼此独立运行。如果没有,或者您正在使用语言/线程模型/ IPC模型/等。这会强制所有任务在同一个处理器上运行,然后在上面看到“在一个处理器上”。

对于I / O绑定的任务,并行处理通常更好,无论可用的处理器数量多少,因为CPU速度快且I / O速度慢,因此并行工作允许一个任务处理其数据,而其他正在等待I / O操作完成。 (这就是为什么make -j2往往明显快于普通make,即使在单处理器机器上也是如此。)

但是,同样,这些都是普遍性,并且所有情况都是不正确的。只有基准测试才能确定地揭示真相。

答案 2 :(得分:1)

没有理由认为在单CPU核心系统中,并行处理会更快。

考虑这个png示例: enter image description here

顶部的红色和蓝色线表示在单个核心上顺序运行的两个任务。

底部的备用红色和蓝色线表示在单个核心上并行运行的两个任务。