Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl线程比顺序处理更快?_Perl_Performance - Fatal编程技术网

Perl线程比顺序处理更快?

Perl线程比顺序处理更快?,perl,performance,Perl,Performance,只是想问一下并行处理是否比顺序处理更快。 我一直认为并行处理速度更快,所以我做了一个实验。 我对我的脚本进行了基准测试,在做了一系列测试之后发现 sub add{ for ($x=0; $x<=200000; $x++){ $data[$x] = $x/($x+2); } } 子添加{ 对于($x=0;$x来说,没有理由认为在单CPU核心系统中,并行处理会更快 以png为例: 顶部的红色和蓝色线条表示在单个内核上顺序运行的两个任务 底部的红色和蓝色交

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

sub add{

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

}
子添加{

对于($x=0;$x来说,没有理由认为在单CPU核心系统中,并行处理会更快

以png为例:

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


底部的红色和蓝色交替线表示在一个内核上并行运行的两个任务。

Perl线程非常糟糕。在任何情况下,您最好分叉多个进程

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

  • 对作用域中的每一个perl数据结构进行复制(是的,是真实的复制),包括那些属于您没有编写的模块的数据结构
  • 在一个新的OS线程中启动几乎是一个新的、独立的perl实例
如果你想共享任何东西(因为它现在已经复制了所有东西),你必须在threads模块中使用share函数胡说八道,在其周围添加了太多太细粒度的锁定以防止并发访问。访问共享变量会导致大量隐式锁定,而且速度非常慢

简而言之,perl线程:

  • 开始需要很长时间
  • 浪费内存
  • 无论如何都无法高效地共享数据

您最好使用fork(),它不会复制每个变量(内核会在写入时复制),除非您在Windows上。

并行处理与顺序处理是否更好取决于任务,并且您已经做了正确的事情:您对这两个变量进行了基准测试并确定了任务(你的基准测试,不一定是你真正想要做的)哪一个更快

一般来说,在单个处理器上,顺序处理往往更适合CPU受限的任务,因为如果您有两个任务,每个任务需要5秒的CPU时间才能完成,那么无论您是顺序还是并行执行,您都需要10秒的CPU时间。设置多个线程/进程将因此,没有任何好处,但它会产生额外的任务切换开销,同时也会阻止您获得任何结果,直到所有结果都可用为止

如果多处理器系统上的CPU绑定任务可以彼此独立运行,则并行运行时性能会更好。如果不是,或者如果您使用的语言/线程模型/IPC模型/等强制所有任务在同一处理器上运行,请参阅上面的“单处理器上”

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


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

但是看到我可能会一次解析5-6个日志文件,并使用不同的sub,那么哪一个会更快。@robobooga:你真的需要性能提升吗?如果这是读取日志的话文件…磁盘访问可能是瓶颈吗?如果客户端可能有多个CPU核,那么使用线程没有坏处。如果有办法确定CPU核/线程数,那么只有当有多个物理核时,您的程序才可以使用线程。我真的需要尽可能多地挤出速度我正在分析实时服务器的日志,我希望尽快通知异常情况。至于磁盘访问,我的实验只处理算术过程,但速度较慢。我想知道开销是否是导致速度缓慢的原因。我不想这么说,但是……你实际上没有发布完整的code,因此从我们的角度来看,很可能您没有正确地划分任务,或者在其他地方存在瓶颈。两个足够耗时、CPU有限的任务真正并行运行(即多核系统)当然会比按顺序运行相同的两个更快。因此,如果进程是从单核系统运行的,并行确实不会加快处理速度,对吗?假设我不知道客户机是运行单核系统还是多核系统,作为开发人员,您会推荐哪种处理方式根据,您认为是快速的在理想情况下,两种方法都会导致任务花费相同的时间。单核心上下文中的线程更适合加载屏幕之类的事情,您希望在后台加载文件,但同时显示低fps(可能是动画)屏幕。@Truncheon谢谢,我想我明白了