我正在尝试用Perl编写一个监视脚本,它应该检查URL列表。我使用的是LWP::UserAgent
、HTTP::Response
和Time::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循环的情况下手动运行脚本,我得到的平均响应时间大约是70ms,但是有了while循环,我得到了大约5ms的响应时间,这是不真实的。
LWP::UserAgent
做缓存了吗?如果是,是否可以禁用它?如何禁用它?如果不是,我做错了什么?
发布于 2012-10-27 02:57:36
除非您告诉LWP
,否则它不会自己做任何缓存,但是在LWP和宿主站点之间有很多东西。例如,您是否通过代理进行工作?如果是这样,那么它将缓存它获取的页面,以防第二次需要它们。云中还有许多其他缓存可能会加快您的响应速度,但7ms的时间意味着合理的本地缓存。
您还应该使用Time::HiRes
中的tv_interval
子例程来计算间隔。它期望您将来自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";
}
无论如何,对于一个普通的国家网站,我的初始获取时间大约是500ms,随后的后续获取时间大约是300ms。因此,一些缓存正在进行,但影响比您报告的要小得多。
发布于 2012-10-27 00:03:50
尝试使用设置为丢弃所有连接的LWP::ConnCache对象设置conn_cache
(例如,请参阅其total_capacity
子例程)。
发布于 2012-10-27 00:21:46
看起来您没有正确估计已用时间。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
https://stackoverflow.com/questions/13090182
复制相似问题