1

所以,我正在考虑使用分叉或线程来做一些简单的并行化。为了确保这样做是值得的,我编写了三个简单的脚本来对顺序、线程和分叉进行基准测试。我使用了两种非常简单的方法来初始化数组数组,然后使用另一种方法来查找每个数组中的最大元素并将其写入文件。

方法:

sub initialize
{
    for (my $i=0; $i <= 2; $i++)
    {
        for (my $j=0; $j < 5000000; $j++)
        {
        $array[$i][$j]=$j+$i;
        }
    }
}  

sub getMax 
{
        my $num = shift;
        my $array = shift;
        my $length=scalar(@{$array});
        my $max=-9**9**9;
        my @ra;

        for (my $i=0; $i < $length; $i++) 
        {
            if ($max < ${$array}[$i])
            {
            $max=${$array}[$i];
            }
        }

        tie @ra, 'Tie::File', "test.txt" or die;
        $ra[$num]=$max;
}

顺序:

my $start = Time::HiRes::time();
for (my $count = 0; $count <= 2; $count++) 
{
    getMax($count,$array[$count]);
}

my $stop = Time::HiRes::time();
my $duration = $stop-$start;
print "Time spent: $duration\n"; 
print "End of main program\n";

穿线:

my @threads=();
my $start = Time::HiRes::time();
for (my $count = 0; $count <= 2; $count++) 
{
    my $t = threads->new(\&getMax, $count, $array[$count]);
    push(@threads,$t);
}

foreach (@threads) 
{
    my $num = $_->join;
}

my $stop = Time::HiRes::time();
my $duration = $stop-$start;
print "Time spent: $duration\n";
print "End of main program\n";

分叉:

my $pm = Parallel::ForkManager->new(3);
my $start = Time::HiRes::time();

for (my $count = 0; $count <= 2; $count++)
{
    my $pid = $pm->start and next;   
    getMax($count,$array[$count]);
    $pm->finish; 
}

$pm->wait_all_children;

my $stop = Time::HiRes::time();
my $duration = $stop-$start;

print "Time spent: $duration\n";
print "\nEnd of main program\n";

连续:2.88 秒

穿线:4.10 秒

分叉:3.88 秒

我想出于我的目的(显然不是这个,但计算量不是太大),线程/分叉没有帮助。我知道这两者不仅仅用于时间效率,但我想这是取决于你在做什么的好处之一。所以,我的问题是线程/分叉究竟什么时候真正使一个人的代码运行得更快?

4

1 回答 1

4

处理器和内存是计算机中速度最快的组件。由于快速内存也很昂贵,因此磁盘驱动器用于廉价存储大量数据,但代价是访问速度要慢得多。

当计算机程序依赖于来自慢速媒体的数据时,在必要的数据到达之前,较快的组件通常会无事可做。多线程的主要用途是允许处理器在等待所需资源的同时处理其他事情。

可以并行完成的事情有

  • 在等待某事完成时保持用户界面正常运行

  • 进行多处理器计算

  • 从多个互联网站点获取数据

  • 从多个磁盘驱动器读取

所有这些的重要一点是,多线程只有在线程不相互竞争相同资源时才有优势。

例如,试图通过在两个线程中读取一半数据来加快磁盘读取速度是不会成功的,因为磁盘控制器存在瓶颈,并且它返回数据的速度也受到限制。但是 RAID 驱动器可以通过同时从多个驱动器中的每个驱动器读取部分数据来加快速度。

在您的示例中,只有一个处理器可以进行最大计算。让多个线程执行它并不意味着处理器可以更快地完成工作,实际上它会因必须在线程之间切换而减慢。但是,如果您可以安排每个线程在多处理器系统的单独处理器上运行,您获得优势。视听软件经常使用这种技术来获得最大的处理速度。

同样,从多个 Internet 源并行获取数据可能非常有用,但只有在达到链接容量之前,线程将开始相互竞争带宽。

于 2013-04-30T03:26:37.440 回答