2009-04-24 4 views
5

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

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

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

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

Решение webrequest похоже на подход, который я использую для использования, однако было бы неплохо измерить время, необходимое для полной загрузки страницы (изображения, css, javascript и т. Д.). , Есть идеи, как это можно сделать?

ответ

16

Если вы хотите записать, сколько времени потребуется, чтобы получить основной источник страницы, вы можете обернуть 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; 

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

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

+1

+1 - Мне странно комфортно с этой идеей - lol –

+0

Великие умы думают одинаково :) –

+0

Я тоже! Я, вероятно, буду использовать его в своем коде, я думаю, что измерение дополнительного содержимого будет очень сложно реализовать с точностью. – holiveira

1

Нечто подобное, вероятно, отлично работает:

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

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

3

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

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

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

+0

+1 для селена! –

2

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

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

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

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

1

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

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

1

Я часто сталкиваюсь с аналогичной проблемой. Однако я придерживаюсь немного другого подхода: во-первых, почему я должен заботиться о статическом контенте вообще? Я имею в виду, конечно, это важно для пользователя, если для изображения требуется 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 мы знаем «нормальную» производительность сайта, загружая все содержимое (этап разработки). С бенчмарком мы получаем текущую ситуацию с сервером (даже на нашем мобильном телефоне). ОК. Что дальше? Мы должны убедиться, что все/большинство посетителей получают хорошую связь. Я считаю эту часть очень трудной и открытой для предложений. Однако я пытаюсь взять файлы журнала и выполнить ping несколько IP-адресов, чтобы узнать, сколько времени потребуется для достижения этой сети. Кроме того, до того, как я решила обратиться к конкретному интернет-провайдеру, я стараюсь читать о связности и мнениях пользователей ...

Смежные вопросы