Проверка времени загрузки страницы нескольких URL одновременно
Кто-нибудь может подсказать мне, какой код C# я должен написать для получения времени загрузки страницы каждого URL-адреса, если URL-адреса приведены в качестве входных данных?
ИЛИ ЖЕ
если возможно, пожалуйста, дайте мне ссылку на любое программное обеспечение, которое делает это. Любое программное обеспечение, которое принимает несколько URL в качестве входных данных и предоставляет время загрузки страницы для каждого URL.
7 ответов
Вы хотите измерить время, необходимое для ответа на первый запрос, или вы хотите включить загрузку стилей и внешних скриптов, а также рендеринг на стороне клиента?
Первый может быть просто решен с помощью WebClient.
WebClient client = new WebClient ();
// Add a user agent header in case the
// requested URI contains a query.
client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Stream data = client.OpenRead (@"your-url-here");
StreamReader reader = new StreamReader (data);
string s = reader.ReadToEnd();
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);
data.Close();
reader.Close();
Что касается последнего, поместите WebBrowser в форму, где вы создадите метод для использования события DocumentCompleted:
// in your form declarations
Stopwatch _stopwatch = new Stopwatch();
String _url = @"your-url-here";
// in the button-click or whenever you want to start the test
_stopwatch.Start();
this.WebBrowser1.Navigate(_url);
// The DocumentCompled event handler
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url == _url)
{
_stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}", _stopwatch.Elapsed);
}
}
Если я правильно понимаю вопрос, то Apache JMeter может сделать это: http://jmeter.apache.org/
Это сценарий, и вы можете настроить различные сценарии для нагрузочного тестирования.
Попробуй это
var URLs = new[]
{
"http://www.google.com",
"http://www.microsoft.com",
"http://www.slashdot.org"
};
var tasks = URLs.Select(
url => Task.Factory.StartNew(task =>
{
using (var client = new WebClient())
{
var t = (string)task;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
String result = client.DownloadString(t);
stopwatch.Stop();
Console.WriteLine(String.Format("{0} = {1}", url, stopwatch.Elapsed));
}
}, url)
).ToArray();
Task.WaitAll(tasks);
С этим я получаю
http://www.microsoft.com = 00:00:05.1784172 milliseconds
http://www.slashdot.org = 00:00:09.9922422 milliseconds
http://www.google.com = 00:00:10.8720623 milliseconds
Я рекомендую YSlow, очень полезные инструменты для проверки производительности сайта, YSlow
Я уверен, что вы знакомы с прокси-сервером Fiddler. В Fiddler есть много того, что вам не понадобится (например, пользовательский интерфейс) для вашего приложения, однако они предоставляют библиотеку.NET, которая может быть включена в ваш проект, которая даст вам всю HTTPness, какую вы когда-либо хотели.
В настоящее время FiddlerCore предоставляется в виде библиотеки классов.NET, которая может использоваться любым приложением.NET. FiddlerCore разработан для использования в специальных приложениях, которые работают без пользовательского интерфейса (например, автоматизация тестирования) или с таким специализированным пользовательским интерфейсом, что дополнение Fiddler не будет подходящим вариантом (например, визуализация трафика WPF).
В загрузку включен пример приложения, которое я изменил за несколько минут и которое даст вам доступ к той же информации, которая отображается в пользовательском интерфейсе Fiddler на вкладке статистики. Проверьте объект Session.Timers в dll fiddlercore для этих значений.
Клиент подключен: 15: 03: 05.017
ClientBeginRequest: 15: 03: 05.056
ClientDoneRequest: 15: 03: 05.076
Определить шлюз: 0 мс
DNS-поиск: 3 мс
TCP/IP Connect: 20 мс
HTTPS Рукопожатие: 0 мс
Сервер подключен: 15: 03: 05.151
FiddlerBeginRequest: 15: 03: 05.152
ServerGotRequest: 15: 03: 05.157
ServerBeginResponse: 15: 03: 05.292
ServerDoneResponse: 15: 03: 05.314
ClientBeginResponse: 15: 03: 05.331
ClientDoneResponse: 15: 03: 05.333
Всего прошло: 00:00:00.2770277
Надеюсь, это поможет, вам нужно будет выяснить, как создать собственный сеанс вместо использования прокси-сервера, но это заявленная функция продукта и не должна требовать много времени.
Я использую это для поддержания активности внутренних веб-сайтов и измерения / регистрации времени отклика, что-то вроде сервиса поддержки активности:
static void Main(string[] args)
{
LoggingManager.ConfigureAtStartup();
ErrorLogger.LogInformation("STARTED");
try
{
if (args.Length < 1)
{
ErrorLogger.LogInformation("No parameters provided...");
return;
}
int pingTimeoutMilliseconds = Convert.ToInt32(ConfigurationManager.AppSettings["pingTimeoutMilliseconds"]);
var urls = args[0].Split(';');
foreach (string url in urls)
{
if (string.IsNullOrWhiteSpace(url))
{
continue;
}
ErrorLogger.LogInformation(String.Format("Pinging url: {0}", url));
using (var client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
var stopW = new Stopwatch();
stopW.Start();
string result = client.DownloadString(url);
var elapsed = stopW.ElapsedMilliseconds;
stopW.Stop();
if (elapsed > pingTimeoutMilliseconds)
{
ErrorLogger.LogWarning(String.Format("{0} - took: {1} milliseconds to answer!", url, elapsed.ToString("N0")));
ErrorLogger.LogInformation(String.Format("Response was: {0} chars long", result.Length.ToString("n0")));
}
}
}
}
catch(Exception exc)
{
ErrorLogger.LogError(exc);
}
finally
{
ErrorLogger.LogInformation("COMPLETED");
LoggingManager.ShutdownOnExit();
}
}
ErrorLogger
это маленькая обертка, которую я сделал вокруг Log4Net
,