1

我有一些代码:

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);
      }
    }
  }
}

如何获得每秒(或每分钟)的速度(调用方法“某物”的次数)?谢谢。

4

2 回答 2

2

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

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

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

于 2012-12-05T14:56:09.883 回答
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 数组 - 或在您在 join() 之后收集的线程本地数组中,或打印到受互斥体保护的文件句柄或其他. 然后你可以对你生成的时间序列做任何你喜欢的事情。

于 2012-12-05T15:19:27.223 回答