Perl: узнайте, сколько времени занимает загрузка файла

Я пытаюсь создать сценарий Perl, который проверяет несколько зеркальных серверов на предмет лучшего зеркала для использования.

Как лучше всего узнать, сколько времени требуется для загрузки файла? Я стараюсь избегать системных вызовов вроде

  $starttime = time();
  $res = `wget -o/dev/null SITE.com/file.txt`;
  $endtime = time();
  $elapsed = $endtime - $starttime;

Я бы предпочел использовать функции Perl


person Bijan    schedule 02.11.2015    source источник
comment
Зачем это нужно на Perl? Почему бы не использовать оболочку и time wget -o/dev/null SITE.com/file.txt? Планируете ли вы использовать wgetsystem) в любом случае? Или вы хотите переписать wget на Perl, а затем рассчитать это время? В последнем случае вам нужно выполнить поиск по search.cpan.org, чтобы найти подходящий модуль (модули) для выполнения работа.   -  person Jonathan Leffler    schedule 02.11.2015
comment
@JonathanLeffler Переносимость. Не у всех есть <insert shell program here> и одна и та же версия. Например, ни OS X, ни Windows не поставляются с wget. Управлять зависимостями модулей Perl стало проще.   -  person Schwern    schedule 03.11.2015


Ответы (1)


Вы можете использовать LWP :: Simple или HTTP :: Tiny (встроен, начиная с версии 5.14.0).

use strict;
use warnings;
use v5.10;  # for say()

use HTTP::Tiny;
use Time::HiRes qw(time); # to measure less than a second
use URI;

my $url = URI->new(shift);
# Add the HTTP scheme if the URL is schemeless.
$url = URI->new("http://$url") unless $url->scheme;

my $start = time;
my $response = HTTP::Tiny->new->get($url);
my $total = time - $start;

if( $response->{success} ) {
    say "It took $total seconds to fetch $url";
    say "The content was @{[ length $response->{content} ]} bytes";
}
else {
    say "Fetching $url failed: $response->{status} $response->{reason}";
}
person Schwern    schedule 02.11.2015