Выполняет ли LWP::UserAgent кэширование?


person Sfairas    schedule 26.10.2012    source источник
comment
Если вы выполняете тесты с LWP, обязательно игнорируйте время первого запроса. При выполнении первого запроса LWP динамически загружает около двух десятков модулей perl (в некоторых ситуациях, например, при запросе URL-адреса https, даже больше) --- чего не происходит при втором и последующих запросах. Вы можете увидеть все эти динамически загружаемые модули, заглянув с помощью strace в вызов скрипта.   -  person Slaven Rezic    schedule 11.05.2021


Ответы (4)


LWP не выполняет никакого кэширования самостоятельно, если вы не скажете ему об этом, но между LWP и хост-сайтом многое. Вы через прокси работаете, например? Если это так, то он будет кэшировать страницы, которые он извлекает на случай, если они потребуются во второй раз. В облаке также есть много других кешей, которые могут ускорить ваш ответ, но время 7 мс подразумевает достаточно локальный кеш.

Вы также должны использовать подпрограмму tv_interval из Time::HiRes для расчета интервалов. Ожидается, что вы сохраните пары результатов из 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";
}

Что бы это ни стоило, для обычного национального веб-сайта я получаю около 500 мс на первоначальную выборку, а затем примерно 300 мс на последующие выборки. Таким образом, некоторое кэширование происходит, но с гораздо меньшим влиянием, чем вы сообщаете.

person Borodin    schedule 26.10.2012
comment
Спасибо за совет по использованию tv_interval. Я не использую is для расчета интервала. Я отправляю http-запросы на локальный хост, поэтому прокси-сервер не задействован. Я предполагаю, что кэширование происходит на стороне сервера, поэтому я получаю такие различия в интервалах. - person Sfairas; 29.10.2012

Попробуйте установить conn_cache с помощью LWP::ConnCache объект, который настроен на разрыв всех соединений (см., например, его подпрограмму total_capacity)

person snoofkin    schedule 26.10.2012
comment
Пробовали это безрезультатно. Кажется, кэширование выполняется на стороне сервера, а не на моей стороне LWP::UserAgent. - person Sfairas; 29.10.2012

Похоже, вы неправильно оцениваете прошедшее время. 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
person quicoju    schedule 26.10.2012
comment
Я всегда предпочитал Time::HiRes::time, не надо конторсий, это просто время испокон веку как поплавок. - person kbenson; 27.10.2012
comment
Бывают случаи, когда требуется большее разрешение, чем то, которое обеспечивает Time::HiRes::time. - person quicoju; 27.10.2012
comment
Да, мне нужна точность в микросекундах, проблема здесь не в gettimeofday, так как когда я запускаю код без цикла while, я получаю прошедшее время, которое я ожидаю. - person Sfairas; 29.10.2012

LWP не выполняет кэширование, но ОС, вероятно, будет кэшировать данные, такие как результаты поиска DNS, поэтому это займет время только при первом поиске и после истечения срока действия кэша ОС.

person Gene Vincent    schedule 28.10.2012