Perl线程获得迭代速度

时间:2012-12-05 14:45:53

标签: multithreading perl profiling

我有一些代码:

for my $t (1..$threads) {
  push @threads, threads->create(\&action_, $t);
}
for my $t (@threads) {
  $t->join();
}

sub action_ {
  while (@sites) {
    my $url = shift @sites;
    for my $data1 (@data) {
      for my $data2 (@data2) {
        something($url, $data1, $data2);
      }
    }
  }
}

如何获得速度(呼叫数量方法"某些东西")每秒(或分钟)? 感谢。

2 个答案:

答案 0 :(得分:2)

Perl在CPAN中有许多基准测试模块。看看:http://perldoc.perl.org/Benchmark.html

这很好地解释了;基本上你想要基准测试的代码包含在子程序中,你可以自由地计算或比较不同的例程。

我最常使用的方法是在“方法”和“新建”标题下。

答案 1 :(得分:2)

如果您希望自己快速完成,可以像以下那样获得粗略估计:

use List::Util qw(sum);
use feature qw(say);
...

my $t0 = time();  # See also Time::HiRes
threads->create(\&action_) for 1 .. $nthreads;
my $nsomething = sum map { $_->join } threads->list();
my $elapsed = time() - $t0;

say "Among $nthreads threads we called something() ",
    ($nsomething/$elapsed),
    " times per second";

sub action_ {
  my $n;
  while (...) { ... something(); $n++; ... }
  return $n;
}

如果这还不够好,您可能每次调用something()将调用它的时间推送到threads::shared::share() d数组 - 或者在连接后收集的线程局部数组中(),或打印到受互斥锁保护的文件句柄或其他任何东西。然后你可以用你生成的时间序列做任何你喜欢的事情。