Проверка времени загрузки страницы нескольких URL одновременно

Может ли кто-нибудь указать мне, какой код С# я должен написать для получения времени загрузки страницы каждого URL-адреса, если URL-адреса указаны в качестве входных данных?

OR

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


person Vaibhav    schedule 15.11.2011    source источник
comment
Пожалуйста, примите во внимание, что результаты могут сильно различаться: внезапная высокая нагрузка на сервер, высокая загрузка процессора вашего маршрутизатора и т. д. Чего вы пытаетесь достичь?   -  person RvdK    schedule 15.11.2011
comment
Вы хотите создать loads.in? О_о   -  person AlphaMale    schedule 15.11.2011
comment
Мне просто нужен код, с помощью которого я получаю время загрузки страницы (как мы получаем в инструменте HTTPCheck в Internet Explorer), когда в качестве входных данных задано несколько URL-адресов.   -  person Vaibhav    schedule 15.11.2011
comment
Что вы на самом деле хотите протестировать? Если это то, как долго загружаются веб-страницы, посмотрите на частный экземпляр Web Page Test (webpagetest.org), это можно использовать в сценариях.   -  person Andy Davies    schedule 16.11.2011


Ответы (7)


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

Первую можно просто решить с помощью Веб-клиент.

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();

В последнем случае поместите веб-браузер на форма, в которой вы создаете метод для использования 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);
    }
}
person CodeCaster    schedule 21.11.2011
comment
Не могли бы вы также предоставить мне код? В конце концов, это вопрос репо +100 !! - person Vaibhav; 21.11.2011
comment
на самом деле первый предоставленный вами код в порядке, но URL-адреса, о которых я говорю, требуют аутентификации для их доступа (я подключаюсь к определенной VPN, а затем открываю браузер с определенными учетными данными для доступа к URL-адресу), я не думаю, что также заботится о тот ? - person Vaibhav; 21.11.2011
comment
ваш второй код работает нормально, но он дает время загрузки страницы, даже если страница не загружена успешно !! - person Vaibhav; 21.11.2011
comment
@vaibhav во-первых, это должно зависеть от вашей конфигурации. webClient.Credentials = new System.Net.NetworkCredential("UserName", "Password", "Domain"); должно работать. Во-вторых, попробуйте проверить, является ли e.Url URL-адресом, который вы запрашиваете. Он будет срабатывать для каждого ресурса на странице, например для изображений, таблиц стилей и т. д. - person CodeCaster; 21.11.2011

Если я правильно понимаю вопрос, то Apache JMeter может сделать это: http://jmeter.apache.org/

Он доступен для сценариев, и вы можете настроить различные сценарии для нагрузочного тестирования.

person djdy    schedule 21.11.2011

Попробуй это

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
person Rohit Sharma    schedule 27.11.2011

Я рекомендую YSlow, очень полезный инструмент для проверки производительности сайта, YSlow

person DeveloperX    schedule 15.11.2011

Я уверен, что вы знакомы с прокси-сервером веб-отладки Fiddler. В Fiddler есть много того, что вам не понадобится (например, пользовательский интерфейс) для вашего приложения, однако они предоставляют библиотеку .NET, которую можно включить в ваш проект, которая даст вам все возможности HTTP, которые вы когда-либо могли пожелать.

FiddlerCore в настоящее время предоставляется в виде библиотеки классов .NET, которую может использовать любое приложение .NET. FiddlerCore предназначен для использования в специализированных приложениях, которые работают либо без пользовательского интерфейса (например, автоматизация тестирования), либо с настолько специализированным пользовательским интерфейсом, что надстройка Fiddler не подходит (например, визуализация трафика WPF).

В загрузку включен пример приложения, которое я изменил за несколько минут и которое даст вам доступ к той же информации, которая отображается в пользовательском интерфейсе скрипача на вкладке статистики. Проверьте объект Session.Timers в dll fiddlercore для этих значений.

ClientConnected: 15:03:05.017
ClientBeginRequest: 15:03:05.056
ClientDoneRequest: 15:03:05.076
Определение шлюза: 0 мс
Поиск DNS: 3 мс
Подключение TCP/IP: 20 мс
Квитирование HTTPS: 0 мс
ServerConnected: 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

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

person Jeremy Gray    schedule 21.11.2011

Вам понадобится Stopwatch, либо WebClient, либо WebRequest.

person Roger Lipscombe    schedule 15.11.2011

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

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.

person Davide Piras    schedule 15.11.2011