在Perl中测量函数调用的执行时间

时间:2017-11-16 15:30:07

标签: perl time

仅当前一个功能尚未结束且时间结束时才可以执行人员 类似的东西:

my $timeout = 10; # seconds
sub get_entities {
    # do staff ...
}
get_entities();

if (time == $timeout and get_entities is not over yet) {
    # do staff...
}

2 个答案:

答案 0 :(得分:5)

你试过这个吗?

my $start = time;
get_entities();
my $duration = time - $start;

或者您正在寻找更复杂的东西吗?

答案 1 :(得分:3)

您的编辑使问题变得更加复杂。

我确信你会知道 - 作为一个标准,perl按顺序运行 - 如果一个命令需要25秒,那么其余的代码就会等到它准备就绪。

但有时候,你想要出于各种原因自己构建超时。有很多方法可以做到这一点:

alarm和信号处理程序

#!/usr/bin/env perl

use strict;
use warnings; 

$SIG{'ALRM'} = \&handle_alarm; 

my $we_are_snoozing = 1;

sub handle_alarm {

   print "Caught SIGALRM\n";
   $we_are_snoozing = 0;
}

sub have_a_snooze {
   while ( $we_are_snoozing ) {
       print "Zzzz\n";
       sleep 10;
   }
}


alarm 25;
have_a_snooze;
print "Done\n";

你在处理程序中可以做的事情是有限的 - 保持最小化。但是alarm会生成SIGALRM(也可以由kill生成),并且该进程可以捕获并处理它。

<强> threads

线程允许您分离部分代码以并行或异步运行。这对于资源使用都很方便,但是当你遇到一件不值得无限期等待的事情时也是如此。

#!/usr/bin/env perl

use strict;
use warnings; 

use threads; 
use threads::shared;

my $we_are_snoozing : shared;
$we_are_snoozing = 1; 

sub have_a_snooze {
   while ( $we_are_snoozing ) {
       print "Zzzz\n";
       sleep 10;
   }
}


my $thr = threads -> create (\&have_a_snooze);

sleep 5;

if ($thr -> is_joinable) { 
   print "Thread exited normally\n";
   $thr -> join;
 }
 else {
    print "Thread still running, detaching it\n"; 
    $we_are_snoozing = 0;
    $thr -> detach;
}

IO::Socketcan_read

想要超时的一个常见原因就是等待IO。

使用IO::Socket和超时很容易处理:

#!/usr/bin/env perl
use strict;
use warnings;

my $pid = open ( my $input, '-|', "some_command" );
my $select = IO::Select -> new ( $input ); 
while ( $select -> can_read(10) ) { 
  my $line = <$input>;
  print $line; 
}

这将在最后结果后10秒超时,而不是第一次。但这也许有用。