Как я могу измерить отклик и время загрузки веб-страницы? - PullRequest
5 голосов
/ 25 апреля 2009

Мне нужно создать приложение для форм Windows, чтобы измерить время, необходимое для полной загрузки веб-страницы. Какой лучший способ сделать это?

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

Дополнительная информация:

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

Похоже, что решение для веб-запроса - это подход, который я собираюсь использовать, однако было бы неплохо иметь возможность измерить время, необходимое для полной загрузки страницы (изображения, CSS, JavaScript и т. Д.). Есть идеи, как это можно сделать?

Ответы [ 9 ]

20 голосов
/ 25 апреля 2009

Если вы просто хотите записать, сколько времени потребуется, чтобы получить основной источник страницы, вы можете обернуть HttpWebRequest вокруг секундомера. Э.Г.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);

System.Diagnostics.Stopwatch timer = new Stopwatch();
timer.Start();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

timer.Stop();

TimeSpan timeTaken = timer.Elapsed;

Однако это не будет учитывать время загрузки дополнительного контента, например изображений.

[edit] В качестве альтернативы этому вы можете использовать элемент управления WebBrowser и измерить время между выполнением .Navigate () и события DocumentCompleted от срабатывания. Я думаю, что это также будет включать в себя время загрузки и рендеринга дополнительного контента. Однако я не использовал огромное количество элементов управления WebBrowser и не знаю, нужно ли очищать кеш, если вы неоднократно запрашиваете одну и ту же страницу.

4 голосов
/ 25 апреля 2009

В зависимости от того, как часто вам нужно это делать, возможно, вы можете попробовать использовать Selenium (инструмент автоматического тестирования для веб-приложений), так как он использует внутренний веб-браузер, вы будете иметь достаточно близкие меры. Я думаю, что было бы не слишком сложно использовать Selenium API из приложения .Net (поскольку вы даже можете использовать Selenium в модульных тестах).

Измерение такого рода вещей сложно, потому что веб-браузеры имеют некоторые особенности, когда затем загружают все элементы веб-страниц (JS, CSS, изображения, фреймы и т. Д.) - такого рода особенности объясняются в этой замечательной книге ( http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/).

Самодельное решение, вероятно, было бы слишком сложным для кодирования или не учитывало бы некоторые из этих особенностей (измерение времени, затрачиваемого на загрузку html, недостаточно).

2 голосов
/ 25 апреля 2009

Одна вещь, которую вы должны учитывать, это кеш. Убедитесь, что вы измеряете время загрузки с сервера, а не из кеша. Вам нужно убедиться, что вы отключили кэширование на стороне клиента.

Также обратите внимание на кэширование на стороне сервера. Предположим, вы загружаете темп в 9:00 утра, и это занимает 15 секунд, затем вы загружаете его в 9:05, и это занимает 3 секунды, и, наконец, в 10:00 это снова занимает 15 секунд.

Может случиться так, что в 9 сервер должен был полностью отобразить страницу, так как в кеше ничего не было. В 9:05 страница была в кеше, поэтому ее не нужно было отображать снова. Наконец, к 10 кэш был очищен, поэтому сервер снова должен был отобразить страницу.

Я настоятельно рекомендую вам воспользоваться надстройкой YSlow для FireFox, которая даст вам подробный анализ времени, необходимого для загрузки каждого из элементов на странице.

1 голос
/ 14 июня 2009

Я часто сталкиваюсь с довольно похожей проблемой. Однако я придерживаюсь немного другого подхода: во-первых, зачем мне вообще заботиться о статическом контенте? Я имею в виду, конечно, что это важно для пользователя, если для изображения требуется 2 минуты или 2 секунды, но это не моя проблема ПОСЛЕ того, как я полностью разработал страницу. Эти вещи являются проблемами при разработке, и после развертывания это не статический контент, а динамический материал, который обычно замедляет работу (как вы сказали в предыдущем абзаце). Следующее - почему ты веришь, что так много вещей остаются неизменными? Если кто-то в вашей сети запускает p2p-программу, маршрутизация идет не так, как надо, или у вашего интернет-провайдера есть некоторые проблемы, с которыми ваша серверная статистика непременно будет работать. А что говорит ваш тест для пользователя, живущего по всему миру или просто использующего другого интернет-провайдера? Все, что я говорю, это то, что вы сравниваете СВОЮ точку зрения, но это не говорит о производительности серверов, не так ли?

Почему бы не позволить самому сайту / серверу определить, сколько времени потребовалось для загрузки? Вот небольшой пример, написанный на PHP:

function microtime_float()
{
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}

function benchmark($finish)
{
  if($finish == FALSE){  /* benchmark start*/    
    $GLOBALS["time_start"] = microtime_float();
  }else{ /* benchmark end */    
    $time = microtime_float() - $GLOBALS["time_start"]; 
    echo '<div id="performance"><p>'.$time.'</p></div>';
  }
}

Добавляет в конце страницы время, необходимое для сборки (скрыто с помощью css). Каждые пару минут я проверяю это регулярным выражением и анализирую его. Если это время увеличится, я знаю, что что-то не так (включая статический контент!), И через RSS-ленту я получаю информацию и могу действовать.

С помощью firebug мы знаем «нормальную» производительность сайта, загружающего весь контент (фаза разработки). С помощью теста мы получаем текущую ситуацию на сервере (даже на нашем мобильном телефоне). ХОРОШО. Что дальше? Мы должны убедиться, что все / большинство посетителей получают хорошую связь. Я нахожу эту часть действительно трудной и открыта для предложений. Тем не менее, я пытаюсь взять файлы журнала и пропинговать пару IP-адресов, чтобы узнать, сколько времени требуется, чтобы добраться до этой сети. Кроме того, прежде чем принять решение о конкретном интернет-провайдере, я пытаюсь прочитать о возможностях подключения и мнениях пользователей ...

1 голос
/ 27 апреля 2009

Я однажды написал экспериментальную программу , которая загружает HTML-страницу и объекты, на которые она ссылается (изображения, фреймы и т. Д.).

Сложнее, чем кажется, потому что есть HTTP-согласование, поэтому некоторые веб-клиенты получат SVG-версию изображения, а некоторые PNG-версию, сильно различающуюся по размеру. То же самое для <object>.

1 голос
/ 25 апреля 2009

Что-то вроде этого, вероятно, будет работать нормально:

System.Diagnostics.Stopwatch sw = new Stopwatch()
System.Net.HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.example.com");
// other request details, credentials, proxy settings, etc...

sw.Start();
System.Net.HttpWebResponse res = (HttpWebResponse)req.GetResponse();
sw.Stop();

TimeSpan timeToLoad = sw.Elapsed;
0 голосов
/ 25 апреля 2009

Если вы используете firefox, установите расширение firebug, найденное по адресу http://getfirebug.com.. Оттуда выберите вкладку net, и она даст вам знать время загрузки / отклика для всего на странице.

0 голосов
/ 25 апреля 2009
0 голосов
/ 25 апреля 2009

Вы можете использовать программное обеспечение, подобное следующему:

http://www.cyscape.com/products/bhawk/page-load-time.aspx

http://www.trafficflowseo.com/2008/10/website-load-timer-great-to-monitor.html

Google поможет найти наиболее подходящий для вас вариант.

...