2009-04-24 19 views
5

Potrzebuję zbudować aplikację formularzy okiennych, aby zmierzyć czas potrzebny do pełnego załadowania strony internetowej, jakie jest najlepsze podejście do tego?Jak mogę zmierzyć czas reakcji i ładowania strony internetowej?

Celem tej małej aplikacji jest monitorowanie niektórych stron na stronie internetowej, w ustalonym wcześniej odstępie czasu, w celu uprzedniego sprawdzenia, czy coś jest nie tak z serwerem lub serwerem bazy danych.

Dodatkowe informacje:

nie mogę korzystać z aplikacji komercyjnych, muszę się rozwijać to, aby móc zapisać wyniki do bazy danych i stworzyć serię raportów na podstawie tych informacji.

Rozwiązanie webrequest wydaje się być podejściem, z którego korzystam, jednak byłoby miło móc zmierzyć czas potrzebny do pełnego załadowania strony (obrazy, css, javascript itp.) . Masz pomysł, jak to zrobić?

Odpowiedz

16

Jeśli chcesz tylko zarejestrować czas potrzebny na pobranie podstawowego źródła strony, możesz owinąć HttpWebRequest wokół stopera. Na przykład.

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; 

Nie uwzględnia to jednak czasu na pobranie dodatkowej zawartości, takiej jak obrazy.

[edytuj] Alternatywnie można użyć kontrolki WebBrowser i zmierzyć czas między wykonaniem zdarzenia .Navigate() i zdarzenia DocumentCompleted. Myślę, że będzie to również czas pobierania i renderowania dodatkowych treści. Jednak nie używam formantu WebBrowser w ogromnej ilości i tylko nie wiem, czy musisz wyczyścić pamięć podręczną, jeśli wielokrotnie żądasz tej samej strony.

+1

+1 - Jestem dziwnie komfortowo z tym pomysłem - lol –

+0

Wielkie umysły myślą podobnie :) –

+0

Ja też! Prawdopodobnie użyję tego w moim kodzie, myślę, że pomiar dodatkowej zawartości będzie bardzo trudny do wdrożenia z precyzją. – holiveira

1

Coś jak to będzie prawdopodobnie działać poprawnie:

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

Jeśli używasz firefox zainstalować rozszerzenie firebug znaleźć na http://getfirebug.com. Stamtąd wybierz kartę netto, a ona poinformuje Cię o czasie ładowania/odpowiedzi dla wszystkich elementów na stronie.

3

W zależności od częstotliwości, którą należy wykonać, może warto spróbować użyć Selenium (automatycznego narzędzia do testowania aplikacji internetowych), ponieważ użytkownicy wewnętrznie korzystają z przeglądarki internetowej. Myślę, że nie byłoby zbyt trudno używać API Selenium z aplikacji .Net (ponieważ można nawet używać Selenium w testach jednostkowych).

Pomiar tego rodzaju rzeczy jest trudny, ponieważ przeglądarki internetowe mają pewne cechy szczególne, gdy następnie pobierają wszystkie elementy stron internetowych (JS, CSS, obrazy, ramki iframe itp.) - ten rodzaj szczegółowości wyjaśniono w tej doskonałej książce (http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/) .

Domowe rozwiązanie prawdopodobnie byłoby zbyt skomplikowane, aby go kodować lub nie mogło uczestniczyć w niektórych z tych cech (pomiar czasu poświęconego na pobieranie html nie jest wystarczająco dobry).

+0

+1 dla Selenium! –

2

Jedną z rzeczy, którą należy wziąć pod uwagę, jest pamięć podręczna. Upewnij się, że mierzysz czas pobierania z serwera, a nie z pamięci podręcznej. Musisz upewnić się, że wyłączyłeś buforowanie po stronie klienta.

Należy również pamiętać o buforowaniu po stronie serwera. Załóżmy, że pobierasz tempo o 9:00 i zajmuje to 15 sekund, a następnie pobieramy o 9:05 i zajmuje to 3 sekundy, a na koniec o godzinie 10:00 trwa to ponownie 15 sekund.

To, co może się zdarzyć, to to, że w dniu 9 serwer musiał całkowicie renderować stronę, ponieważ w pamięci podręcznej nie było nic. O godzinie 9:05 strona znajdowała się w pamięci podręcznej, więc nie trzeba było jej ponownie renderować. W końcu po 10 pamięć podręczna została wyczyszczona, więc strona musiała być ponownie renderowana przez serwer.

Gorąco polecam pobranie dodatku do FireFox YSlow, który da szczegółową analizę czasu potrzebnego do pobrania każdego z elementów na stronie.

1

pisałem kiedyś o eksperymentalnyprogram który pobiera strony HTML i obiektów odwołuje (obrazy, iframe, itp).

Bardziej skomplikowane niż się wydaje, ponieważ istnieje negocjacja HTTP, więc niektórzy klienci sieci Web otrzymają wersję obrazu SVG, a niektóre pliki PNG, znacznie różniące się wielkością. To samo dla <object>.

1

Często mam do czynienia z dość podobnym problemem. Jednak przyjmuję nieco inne podejście: Po pierwsze, dlaczego w ogóle mam dbać o zawartość statyczną? Mam na myśli, oczywiście, ważne dla użytkownika, jeśli zdjęcie zajmuje 2 minuty lub 2 sekundy, ale to nie jest mój problem PO W pełni rozwiniętej stronie. Te rzeczy są problemami podczas rozwijania i po wdrożeniu nie jest to statyczna zawartość, ale to dynamiczne rzeczy, które normalnie spowalniają rzeczy (jak powiedziałeś w poprzednim akapicie). Kolejną kwestią jest, dlaczego ufasz, że tak wiele rzeczy pozostaje niezmiennych? Jeśli ktoś w twojej sieci uruchomi program p2p, routing pójdzie nie tak lub twój ISP ma pewne problemy, twoje statystyki serwera z pewnością spadną. Co mówi Twój test porównawczy dla użytkownika mieszkającego na całym świecie lub używającego innego usługodawcy internetowego? Chodzi mi tylko o to, że porównujesz swój punkt widzenia, ale to nie mówi wiele o wydajności serwerów, prawda?

Dlaczego nie pozwolić stronie/serwerowi samodzielnie określić, ile czasu zajęło załadowanie? Oto mały przykład napisany w 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>'; 
    } 
} 

Dodaje na końcu strony czasu zajęło zbudowanie (ukryte z CSS). Co kilka minut przeglądam to za pomocą wyrażenia regularnego i analizuję je. Jeśli ten czas się podniesie, wiem, że coś jest nie tak (łącznie z treścią statyczną!) I przez kanał RSS otrzymuję informacje i mogę działać.

Z firebugiem znamy "normalną" wydajność strony ładującej całą zawartość (faza rozwoju). Dzięki benchmarkowi otrzymujemy aktualną sytuację serwera (nawet w naszym telefonie komórkowym). OK. Co następne? Musimy się upewnić, że wszyscy/większość odwiedzających uzyskuje dobre połączenie. Uważam, że ta część jest naprawdę trudna i jest otwarta na sugestie. Jednak próbuję pobrać pliki dziennika i wysłać polecenie ping na kilka adresów IP, aby sprawdzić, ile czasu zajmuje dotarcie do tej sieci. Dodatkowo zanim zdecyduję się na konkretnego dostawcę ISP, próbuję przeczytać o połączeniach i opiniach użytkowników ...

Powiązane problemy