首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LWP::UserAgent是否执行缓存

LWP::UserAgent是否执行缓存
EN

Stack Overflow用户
提问于 2012-10-26 23:48:37
回答 4查看 1.6K关注 0票数 1

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

下面是我的代码:

代码语言:javascript
运行
复制
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做缓存了吗?如果是,是否可以禁用它?如何禁用它?如果不是,我做错了什么?

EN

回答 4

Stack Overflow用户

发布于 2012-10-27 02:57:36

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

您还应该使用Time::HiRes中的tv_interval子例程来计算间隔。它期望您将来自gettimeofday的结果对存储在数组中,并将计算其中两个结果对之间的差异。您的代码将如下所示

代码语言:javascript
运行
复制
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。因此,一些缓存正在进行,但影响比您报告的要小得多。

票数 1
EN

Stack Overflow用户

发布于 2012-10-27 00:03:50

尝试使用设置为丢弃所有连接的LWP::ConnCache对象设置conn_cache (例如,请参阅其total_capacity子例程)。

票数 0
EN

Stack Overflow用户

发布于 2012-10-27 00:21:46

看起来您没有正确估计已用时间。gettimeof day返回一个同时包含:秒和微秒的数组,因此为了计算经过的时间,您需要进行一些转换。类似于:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13090182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档