Perl线程比顺序处理更快?

rob*_*oga 2 perl performance

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

sub add{

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

}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rkR 7

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

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

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

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

简而言之,perl线程:

  • 花很长时间才能开始
  • 浪费大量的记忆
  • 无论如何都无法有效地共享数据.

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


Dav*_*man 7

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

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

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

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

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