我有perl v5.8.4,我无法安装任何lib /模块,我需要使用vanila版本。 我有一个 perl脚本,可以将HTTP请求发送到网络服务器。我尝试编写一个函数来打印我每秒和每分钟向网络服务器发送的请求数。这个想法是每秒打印一次,然后每分钟打印一次。 我正在考虑类似下面的逻辑:
# First I get the time I started the script
$time = the time the script started
# Then, for each request I increase $req(for sec) and $reqmin(for minute)
for each request, $req++ and $reqmin++
# When $time hits one sec of load, I will print the number of requests I sent and then I will set back $req to 0, so I can reuse the var for the next second
if $time passed 1 sec, print $req (I think this may give me the TPS)
$req = 0
# Same as above, but for minutes
if $time passed 60sec, print $reqmin
$reqmin = 0
以上不是perl代码,而是我试图实现的解释。我没有尝试获取运行时,控制流量或进行任何基准测试。我只是试图了解每秒和每分钟发送的请求数量。
我不确定上面解释的逻辑是否是我在代码中计算TPS(每秒事务数)时应遵循的正确路径。 我遇到的另一个问题是,我不确定如何使用perl计算时间。就像,我需要知道自第一次运行以来1秒已经过去每秒打印请求,同样1分钟。我相信我应该使用perl的时间,但我不确定。
答案 0 :(得分:2)
我为你准备了一个例子。你的算法非常合理。这是一个只执行秒的实现。你应该可以从那里去。
它使用Time::HiRes,它包含在旧的Perl中。我们只需要usleep
来模拟请求。 tv_interval
函数获得两微秒之间的增量,gettimeofday
获取当前的微秒时间。
use strict;
use warnings;
use Time::HiRes qw(tv_interval usleep gettimeofday);
$|++; # disable output buffer
my $req_per_second = 0; # count requests per second
my $sum_towards_second = 0; # sum intervals towards one full second
my $last_timeofday = [gettimeofday]; # start of each interval
foreach my $i ( 1 .. 10000 ) {
do_request();
my $new_timeofday = [gettimeofday]; # end for delta
my $elapsed = tv_interval( $last_timeofday, $new_timeofday ); # get the delta
$last_timeofday = $new_timeofday; # new time is old time for the next round
$sum_towards_second += $elapsed; # add elapsed time to go towards one second
$req_per_second++; # we did one request within the current second
# when we arrive at a full second we reset
if ( $sum_towards_second > 1.0 ) {
printf "approximately %d req/s\n", $req_per_second;
$sum_towards_second = $req_per_second = 0;
}
}
sub do_request {
usleep rand 1000; # emulate the request
}
这个算法接近你的想法,也接近我在评论中概述的内容。在每次迭代中,我们从执行请求开始,然后获取当前时间戳。我们计算最后时间戳的增量并将其添加到计数器。如果该计数器达到1
,我们会打印出我们在该秒钟内完成的请求数。然后我们可以重置时间计数器和请求计数器。
输出看起来像这样。
approximately 1785 req/s
approximately 1761 req/s
approximately 1759 req/s
approximately 1699 req/s
approximately 1757 req/s
我将计算时间作为练习留给读者。