1

我正在尝试在 Perl 中编写一个监视脚本,它应该检查 URL 列表。我正在使用LWP::UserAgent,HTTP::ResponseTime::HiRes模块。

这是我的代码:

use strict;
use warnings;

use LWP::UserAgent;
use HTTP::Response;
use Time::HiRes qw( gettimeofday );

while (1) {

    my $start = gettimeofday();

    my $ua = LWP::UserAgent->new();
    $ua->agent('lb-healthcheck.pl/0.1');
    $ua->timeout(10);

    # download the tile locally
    my $response = $ua->get("myurl");
    my $content  = $response->content;

    my $end = gettimeofday();

    print "$start - $end = ".(($end-$start)*1000)."\n";
}

在没有 while 循环的情况下手动运行脚本,我平均得到大约 70 毫秒的响应时间,但是有了 while 循环,我得到了大约 5 毫秒的响应时间,这是不真实的。

是否LWP::UserAgent进行任何缓存?如果是,是否可以禁用它以及如何禁用它?如果不是我做错了什么?

4

4 回答 4

1

LWP除非您告诉它,否则它自己不会做任何缓存,但是 LWP 和主机站点之间有很多。例如,您是否通过代理工作?如果是这样,那么它将缓存它获取的页面,以防第二次需要它们。云中还有许多其他缓存可能会加快您的响应速度,但 7 毫秒的时间意味着合理的本地缓存。

您还应该使用tv_interval子程序 fromTime::HiRes来计算间隔。它希望您将结果对存储gettimeofday在数组中,并将计算其中两个对之间的差异。你的代码看起来像这样

use Time::HiRes qw( gettimeofday  tv_interval );

while () {

    my $start = [ gettimeofday() ];

    # download the tile locally

    my $end = [ gettimeofday() ];

    print tv_interval($start, $end), "\n";
}

对于它的价值,对于一个普通的国家网站,我的初始提取大约需要 500 毫秒,随后的提取大约需要 300 毫秒。因此,正在进行一些缓存,但影响远小于您报告的影响。

于 2012-10-26T18:57:36.443 回答
0

尝试使用设置为丢弃所有连接conn_cacheLWP::ConnCache对象进行设置(参见其total_capacity子例程,例如)

于 2012-10-26T16:03:50.380 回答
0

LWP 不进行缓存,但操作系统可能会缓存数据,例如 DNS 查找的结果,因此这些数据只会在第一次查找和操作系统缓存过期后花费时间。

于 2012-10-28T08:58:12.867 回答
0

看起来您没有正确估计经过的时间。gettimeof day 返回一个数组,其中包含:经过的秒数和微秒,因此为了计算经过的时间,您需要进行一些转换。就像是:

my ($init_sec, $init_usec) = gettimeofday
# SOME CODE HERE
my ($stop_sec, $stop_usec) = gettimeofday

if ( $init_usec > $stop_usec ) {
   $stop_usec += 1_000_000;
   $stop_sec--;
}

#convert seconds into mseconds
my $tsec  = ( $stop_sec  - $init_sec ) * 1_000; 

# convert usecs into msecs
my $tusec = ( $stop_usec - $init_usec) / 1_000;

# elapsed time is $tsec + $tusec
于 2012-10-26T16:21:46.093 回答