2

我需要获取许多 http url,我使用 AnyEvent::HTTP 来执行此操作对于每个 URL 我需要测量所花费的时间我该怎么做?

我的代码(精简)在这里

    #!/usr/bin/perl                                                                                                                                                          

use strict;
use AnyEvent::HTTP;
use AnyEvent::Socket;
use Data::Dumper;


my $internal_ip=v192.168.2.103;   #Use this ip to bind instead of default ip. Harcoding necessary :-( using v$ip                                                         

sub prep_cb {
    my ($socket)=@_;
    my $bind = AnyEvent::Socket::pack_sockaddr undef, $internal_ip;
    # I need to start the time here                                                                                                                                      
    bind $socket, $bind
         or die "bind: $!";
}

my $url="http://192.168.2.105/echo.php";

my $anyevent = AnyEvent->condvar;
$anyevent->begin;
http_request(
    "GET" => $url,
    on_prepare =>\&prep_cb,
    sub {
        my ($data, $hdr) = @_;
        $anyevent->end;
        # I need to measure the time taken                                                                                                                               
        print Dumper([$data,$hdr]);
    }
    );
$anyevent->recv;
4

2 回答 2

0

如果您将 http_request() 替换为以下内容会怎样:

my $timer;
http_request(
  "GET" => $url,
  on_prepare => sub {$timer = time; prep_cb},
  sub {
      my ($data, $hdr) = @_;
      $anyevent->end;
      print "Took " . (time - $timer) . " seconds.\n";               
      print Dumper([$data,$hdr]);
  }
);
于 2016-10-14T19:07:50.673 回答
0

更简单的方法是有一个变量并更新它并在TheAmigo提到on_prepare之后记录它$anyevent->end

分析/计时任何函数的一般方法:假设你的函数是fetchHttpUrl($url),你可以这样称呼它

profile(\&fetchHttpUrl, $url);

sub profile {
    my($function, @arguments) = @_;
    my $startTime = currentTimeInMilliseconds();
    $function->(@arguments);
    my $durationInMs = currentTimeInMilliseconds() - $startTime;
    print"{".getMethodNameFromPointer($function)."(".join(",", @arguments).")"."} : $durationInMs ms";
}
于 2016-10-17T05:28:40.793 回答