我有一个子程序, 我已经尽我所能进行串行优化, 大概像这样:
sub overlap {
my $hash_reference = shift; # pass the hash to the subroutine
my %h = %{ $hash_reference }; # refer to the hash as %h
my $standard = shift; # this is the key that will be compared against
my $compared = shift; # this is the key being compared
my $start_index = 0; # this will continually be increased
# to save computation time
# I want to parallelize here
foreach my $s ( 0 .. scalar @{ $h{$standard}{end} }-1 ) {
foreach my $c ( $start_index .. scalar @{ $h{$compared}{end} }-1 ) {
... # abbreviated for minimal working example
}
}
return ($standard_indices_met_in_compared, \@overlay);
}
这是一个慢速子程序。我大约需要花费12-14分钟运行数千次,但是反复运行会浪费时间。
我经常使用Parallel::ForkManager
来进行系统进程处理,但在这里效果不佳。
Parallel::ForkManager
的实现如下:
use Parallel::ForkManager qw();
my $manager = new Parallel::ForkManager(2);
foreach my $s ( 0 .. scalar @{ $h{$standard}{end} }-1 ) {
foreach my $c ( $start_index .. scalar @{ $h{$compared}{end} }-1 ) {
$manager->start and next;
... # abbreviated for minimal working example
}
$manager->finish;
}
$manager->wait_all_children; # necessary after all lists
我看了一些帖子,但没有看到如何在这里应用。
我看过 Perl 多线程和 foreach,以及 Perl 线程文档和其他许多来源,但我不知道如何将以前的做法应用到这种情况。我看到的所有东西都只适用于系统命令。
我想写入一个共享数组和标量,没有系统命令。如果我漏掉了什么,请告诉我。
如何在子例程内并行化此 foreach
循环?
P::FM
设置放在循环内部了吗?那样会很糟糕。简而言之,将对象放在循环外面,只在子代码内部使用。你只需要一个对象来完成整个操作。 - zdim