只是想问一下,并行处理是否比顺序处理更快。 我一直以为并行处理速度更快,所以我做了一个实验。 我对我的脚本进行了基准测试,并在做了一堆
后发现了sub add{
for ($x=0; $x<=200000; $x++){
$data[$x] = $x/($x+2);
}
}
线程似乎平均减慢约0.5个CPU秒。这是正常的还是顺序处理更快是真的吗?
答案 0 :(得分:7)
Perl线程非常糟糕。在每种情况下你最好都要求几个过程。
在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示例:
顶部的红色和蓝色线表示在单个核心上顺序运行的两个任务。
底部的备用红色和蓝色线表示在单个核心上并行运行的两个任务。