gpt4 book ai didi

multithreading - 共享变量的 Perl 线程性能

转载 作者:行者123 更新时间:2023-12-04 11:28:03 25 4
gpt4 key购买 nike

我正在开发一个用 Perl 实现的项目,我认为使用线程来分配工作是一个想法,因为这些任务可以相互独立完成,并且只能从内存中的共享数据中读取。然而,性能远不及我预期的那样。因此,经过一番调查,我只能得出结论,Perl 中的线程基本上很糟糕,但我一直想知道,一旦我实现了一个共享变量,性能就会下降。

例如,这个小程序没有任何共享内容并且消耗了 75% 的 CPU(正如预期的那样):

use threads;

sub fib {
my ( $n ) = @_;
if ( $n < 2 ) {
return $n;
} else {
return fib( $n - 1 ) + fib( $n - 2 );
}
}

my $thr1 = threads->create( 'fib', 35 );
my $thr2 = threads->create( 'fib', 35 );
my $thr3 = threads->create( 'fib', 35 );

$thr1->join;
$thr2->join;
$thr3->join;

一旦我引入了一个共享变量 $a ,CPU 使用率在 40% 到 50% 之间:
use threads;
use threads::shared;

my $a : shared;
$a = 1000;

sub fib {
my ( $n ) = @_;
if ( $n < 2 ) {
return $n;
} else {
return $a + fib( $n - 1 ) + fib( $n - 2 ); # <-- $a was added here
}
}

my $thr1 = threads->create( 'fib', 35 );
my $thr2 = threads->create( 'fib', 35 );
my $thr3 = threads->create( 'fib', 35 );

$thr1->join;
$thr2->join;
$thr3->join;

所以 $a是只读的,不发生锁定,但性能下降。我很好奇为什么会发生这种情况。

目前我在 Windows XP 上的 Cygwin 下使用 Perl 5.10.1。不幸的是,我无法在装有(希望如此)更新的 Perl 的非 Windows 机器上对此进行测试。

最佳答案

您的代码是围绕同步结构的紧密循环。通过让每个线程将共享变量(每个线程只复制一次)复制到非共享变量中来优化它。

关于multithreading - 共享变量的 Perl 线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com