2009-04-24 11 views
5

Ho bisogno di creare un'applicazione Windows Form per misurare il tempo necessario per caricare completamente una pagina Web, qual è l'approccio migliore per farlo?Come posso misurare la risposta e il tempo di caricamento di una pagina Web?

Lo scopo di questa piccola applicazione è monitorare alcune pagine in un sito Web, in un intervallo predeterminato, in modo da essere in grado di sapere in anticipo se qualcosa va storto con il server web o il server del database.

Ulteriori informazioni:

non posso utilizzare un'applicazione commerciale, ho bisogno di sviluppare questo al fine di essere in grado di salvare i risultati in un database e creare una serie di report basati su queste informazioni.

La soluzione webrequest sembra essere l'approccio che sto usando, tuttavia, sarebbe bello poter misurare il tempo necessario per caricare completamente la pagina (immagini, css, javascript, ecc.) . Qualche idea su come potrebbe essere fatto?

risposta

16

Se si desidera solo registrare il tempo necessario per ottenere il sorgente di base della pagina, è possibile racchiudere un HttpWebRequest attorno a un cronometro. Per esempio.

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; 

Tuttavia, questo non terrà conto del tempo necessario per scaricare contenuti extra, come le immagini.

[modifica] In alternativa a ciò, è possibile utilizzare il controllo WebBrowser e misurare l'intervallo di tempo tra l'esecuzione di un evento .Navigate() e l'evento DocumentCompleted. Penso che questo includa anche il download e il tempo di rendering di contenuti extra. Tuttavia, non ho usato il controllo WebBrowser di una quantità enorme e solo non so se devi cancellare una cache se richiedi ripetutamente la stessa pagina.

+1

+1 - Sono stranamente a mio agio con questa idea - lol –

+0

Le grandi menti pensano allo stesso modo :) –

+0

Anch'io! Probabilmente lo userò nel mio codice, immagino che la misurazione del contenuto extra sarà molto difficile da implementare con precisione. – holiveira

1

Qualcosa del genere sarebbe probabilmente funzionerà bene:

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

Se si utilizza Firefox installare l'estensione Firebug trovato alla http://getfirebug.com. Da lì, scegli la scheda di rete, e ti farà sapere il tempo di caricamento/risposta per tutto ciò che riguarda la pagina.

3

A seconda di come la frequenza è necessaria, forse si può provare a utilizzare Selenium (uno strumento di test automatico per le applicazioni Web), dal momento che gli utenti internamente un browser web, si avrà una misura molto vicina. Penso che non sarebbe troppo difficile usare l'API Selenium da un'applicazione .Net (dato che è possibile utilizzare il selenio anche nei test unitari).

Misurare questo genere di cose è difficile perché i browser web hanno alcune particolarità quando poi scaricare tutti gli elementi pagine web (JS, CSS, immagini, iframe, ecc) - questo tipo di particolarità sono spiegate in questo libro eccellente (http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/) .

Una soluzione fatta in casa probabilmente sarebbe troppo complesso per codice o non riuscirebbe a frequentare alcune di quelle particolarità (che misurano il tempo trascorso nel download del codice HTML non è abbastanza buono).

+0

+1 per il selenio! –

2

Una cosa da tenere in considerazione è la cache. Assicurati di misurare il tempo di download dal server e non dalla cache. Dovrai assicurarti di aver disattivato la memorizzazione nella cache del lato client.

Ricordare inoltre la memorizzazione nella cache del lato server. Supponiamo di scaricare il ritmo alle 9:00 e impiega 15 secondi, quindi lo scarichi alle 9:05 e impiega 3 secondi, e infine alle 10:00 occorrono ancora 15 secondi.

Ciò che potrebbe accadere è che a 9 il server ha dovuto eseguire il rendering completo della pagina poiché non c'era nulla nella cache. Alle 9:05 la pagina era nella cache, quindi non aveva bisogno di renderla di nuovo. Alla fine per 10 la cache era stata cancellata, quindi la pagina doveva essere nuovamente renderizzata dal server.

Consiglio vivamente di eseguire il checkout del componente aggiuntivo YSlow per FireFox che fornirà un'analisi dettagliata dei tempi necessari per scaricare ciascuno degli elementi sulla pagina.

1

ho scritto una volta sperimentaleprogram che scarica una pagina HTML e gli oggetti a cui fa riferimento (immagini, iframe, ecc).

Più complicato di quanto sembri perché esiste una negoziazione HTTP, quindi alcuni client Web avranno la versione SVG di un'immagine e una di tipo PNG, di dimensioni molto diverse. Stessa cosa per <object>.

1

Sono spesso confrontato con un problema abbastanza simile. Tuttavia, ho un approccio leggermente diverso: prima di tutto, perché dovrei preoccuparmi del contenuto statico? Voglio dire, ovviamente è importante per l'utente, se ci vogliono 2 minuti o 2 secondi per un'immagine, ma non è un mio problema DOPO che ho completamente sviluppato la pagina. Queste cose sono problemi durante lo sviluppo e dopo la distribuzione non è il contenuto statico, ma sono le cose dinamiche che normalmente rallentano le cose (come hai detto nel tuo ultimo paragrafo). La prossima cosa è, perché ti fidi che così tante cose rimangono costanti? Se qualcuno sulla tua rete attiva un programma p2p, il routing non funziona o il tuo ISP ha dei problemi, le tue statistiche sul server andranno sicuramente giù. E cosa dice il tuo benchmark per un utente che vive in tutto il mondo o che semplicemente usa un ISP diverso? Tutto quello che sto dicendo è che tu stai mettendo a punto il tuo punto di vista, ma questo non dice molto sulle prestazioni dei server, vero?

Perché non lasciare che lo stesso sito/server determini quanto tempo ci vuole per caricare? Ecco un piccolo esempio scritto in 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>'; 
    } 
} 

Si aggiunge alla fine della pagina il tempo impiegato per costruire (nascosto con i CSS). Ogni paio di minuti lo faccio con un'espressione regolare e lo analizzo. Se questa volta sale, so che c'è qualcosa di sbagliato (incluso il contenuto statico!) E tramite un feed RSS mi informo e posso agire.

Con firebug conosciamo le prestazioni "normali" di un sito che carica tutto il contenuto (fase di sviluppo). Con il benchmark otteniamo la situazione attuale del server (anche sul nostro cellulare). OK. Cosa succederà? Dobbiamo assicurarci che tutti/la maggior parte dei visitatori stiano ottenendo una buona connessione. Trovo questa parte davvero difficile e aperta ai suggerimenti. Tuttavia, provo a prendere i file di log e eseguire il ping di un paio di IP per vedere quanto tempo ci vuole per raggiungere questa rete. Inoltre, prima di decidere per un ISP specifico, cerco di leggere la connettività e le opinioni degli utenti ...

Problemi correlati