只是想问一下,并行处理是否比顺序处理更快.我一直以为并行处理速度更快,所以我做了一个实验.我对我的脚本进行了基准测试,并在做了一堆后发现了
sub add{
for ($x=0; $x<=200000; $x++){
$data[$x] = $x/($x+2);
}
}
Run Code Online (Sandbox Code Playgroud)
线程似乎比平均约0.5个CPU秒慢.这是正常的还是顺序处理更快?
Perl线程非常糟糕.在每种情况下,你最好都要求几个过程.
在perl中创建新线程时,它执行以下操作:
如果您想要共享任何内容(因为它现在已经复制了所有内容),您必须使用threads模块中的share函数.这是非常糟糕的,因为它替换了你的变量,带有一些tie()废话,它在它周围添加了太细粒度的锁定以防止并发访问.访问共享变量会导致大量的隐式锁定,并且速度非常慢.
简而言之,perl线程:
使用fork()会好得多,除非你在Windows上,否则它不会复制每个变量(内核会写入copy-copy).
并行与顺序处理是否更好是高度依赖于任务的,并且您已经做了正确的事情:您对两者进行了基准测试并确定了您的任务(您基准测试的那个,不一定是您实际想要的那个)哪一个是快点.
作为一般规则,在单个处理器上,对于受CPU限制的任务,顺序处理往往更好,因为如果您有两个任务,每个任务需要5秒的CPU时间来完成,那么您将需要10秒的CPU时间无论你是按顺序还是并行执行.因此,设置多个线程/进程不会带来任何好处,但它会产生额外的任务切换开销,同时还会阻止您在所有结果可用之前获得任何结果.
多处理器系统上的CPU绑定任务在并行运行时往往会做得更好,前提是它们可以相互独立运行.如果没有,或者您正在使用语言/线程模型/ IPC模型/等.这会强制所有任务在同一处理器上运行,然后在上面看到"在单个处理器上".
对于I/O绑定的任务,并行处理通常更好,无论可用的处理器数量多少,因为CPU速度快且I/O速度慢,因此并行工作允许一个任务处理其数据而另一个正在等待用于完成I/O操作.(这就是为什么make -j2往往比平原快得多make,即使在单处理器机器上也是如此.)
但是,这些都是普遍性,并且所有情况都是不正确的.只有基准测试才能确定地揭示真相.
| 归档时间: |
|
| 查看次数: |
1456 次 |
| 最近记录: |