#!perl use LWP::UserAgent; use Time::HiRes qw( gettimeofday tv_interval ); $times = 4; # Create a user agent object $ua = LWP::UserAgent->new; $ua->agent('SteAgent/0.1 ' . $ua->agent); open(URLS_FILE,@ARGV[0]) or die("no file"); while() { chomp; push @urls, $_; } $n_url = int rand @urls; print "beginning from $n_url\n"; for $i (1 .. $times*@urls) { ++$n_url > $#urls and $n_url=0; # Create a request $req = HTTP::Request->new( GET => $urls[$n_url] ); $t0 = [gettimeofday]; my $expected_length; my $bytes_received = 0; my $res = $ua->request( $req , sub { my($chunk, $res) = @_; $bytes_received += length($chunk); # print "received $bytes_received bytes; elapsed time = ".tv_interval($t0)."\n"; # unless (defined $expected_length) { $expected_length = $res->content_length || 0; } # if ($expected_length) { printf "%d%% - ", 100 * $bytes_received / $expected_length; } # # XXX Should really do something with the chunk itself # print $chunk; }); push @{ $results{ $req->url }{ "time" } }, tv_interval($t0); push @{ $results{ $req->url }{ "status" } }, $res->status_line; push @{ $results{ $req->url }{ "bytes" } }, $bytes_received; $tempo=tv_interval($t0); print "$tempo ".60/$tempo." ".$req->url."\n"; } for $url (@urls) { my @url_time = @{ $results{$url}{"time"} }; my @url_status = @{ $results{$url}{"status"} }; my @url_bytes = @{ $results{$url}{"bytes"} }; format STDOUT_TOP = time | max avg min | status bytes url . format = @.## @.### @.## | @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<< @* max(@url_time), avg(@url_time), min(@url_time), h2s(ccount(@url_status)), h2s(ccount(@url_bytes)), $url . write(); } sub avg { my $ss; for my $ii(@_) { $ss+=$ii; } return $ss/@_ if @_; } sub ccount { my %tt; for my $ii(@_) { $tt{$ii}++; } return %tt; } sub max { my $max = shift @_; for $ii(@_) { $max = $ii if $ii > $max } return $max; } sub min { my $min = shift @_; for $ii(@_) { $min = $ii if $ii < $min } return $min; } sub h2s { my $ss; my %param = @_; for $k(keys %param) { $ss.="$k : $param{$k} / " } return $ss; } .