2009-04-24 18 views
5

Ich muss eine Windows Forms-Anwendung erstellen, um die Zeit zu messen, die benötigt wird, um eine Webseite vollständig zu laden. Was ist der beste Ansatz dafür?Wie kann ich die Antwort und Ladezeit einer Webseite messen?

Der Zweck dieser kleinen App ist es, einige Seiten in einer Website in einem vordefinierten Intervall zu überwachen, um im Voraus wissen zu können, ob etwas mit dem Webserver oder dem Datenbankserver schief läuft.

Zusätzliche Informationen:

ich keine kommerzielle App verwenden können, muss ich diese entwickeln, um der Lage sein, die Ergebnisse in einer Datenbank zu speichern und eine Reihe von Berichten auf der Grundlage dieser Informationen zu erstellen.

Die Webrequest-Lösung scheint der Ansatz zu sein, den ich verwenden werde, aber es wäre nett, in der Lage zu sein, die Zeit zu messen, die es dauert, die Seite vollständig zu laden (Bilder, CSS, Javascript, etc) . Irgendeine Idee, wie das gemacht werden könnte?

Antwort

16

Wenn Sie nur aufzeichnen möchten, wie lange es dauert, die grundlegende Seitenquelle zu erhalten, können Sie eine HttpWebRequest um eine Stoppuhr wickeln. Z.B.

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; 

Dies berücksichtigt jedoch nicht die Zeit, um zusätzliche Inhalte wie Bilder herunterzuladen.

[Bearbeiten] Als eine Alternative dazu können Sie möglicherweise das WebBrowser-Steuerelement verwenden und die Zeit zwischen dem Ausführen einer .Navigate() - und dem DocumentCompleted-Ereignis vom Auslösen messen. Ich denke, das wird auch die Download- und Renderzeit von zusätzlichem Inhalt einschließen. Ich habe jedoch das WebBrowser-Steuerelement nicht in großem Umfang verwendet und weiß nur nicht, ob Sie einen Cache leeren müssen, wenn Sie wiederholt die gleiche Seite anfordern.

+1

+1 - Ich bin merkwürdig wohl mit dieser Idee - lol –

+0

Großartige Köpfe denken gleich :) –

+0

Ich auch! Ich werde es wahrscheinlich in meinem Code verwenden, ich denke, die Messung des zusätzlichen Inhalts wird sehr schwer mit Präzision zu implementieren sein. – holiveira

1

So etwas würde wahrscheinlich funktionieren:

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

Wenn Sie mit Firefox die Firebug-Erweiterung bei http://getfirebug.com gefunden installieren. Von dort aus wählen Sie die Registerkarte "net" und Sie erhalten die Lade-/Antwortzeit für alles auf der Seite.

3

Je nachdem, wie oft Sie es tun müssen, können Sie vielleicht Selenium (ein automatisiertes Test-Tool für Web-Anwendungen) versuchen, da es intern einen Web-Browser, Sie werden eine ziemlich enge Maßnahme haben. Ich denke, es wäre nicht schwierig, die Selenium-API aus einer .Net-Anwendung zu verwenden (da Sie Selenium sogar in Komponententests verwenden können).

Messung dieser Art von Sache ist schwierig, weil Webbrowser einige Besonderheiten haben, wenn dann alle Webseitenelemente herunterladen (JS, CSS, Bilder, iFrames usw.) - diese Art von Besonderheiten werden in diesem ausgezeichneten Buch (http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/) erklärt .

Eine selbst gemachte Lösung wäre wahrscheinlich zu komplex, um Code zu programmieren oder würde einige dieser Besonderheiten nicht berücksichtigen (die Zeit, die beim Herunterladen des HTML-Codes benötigt wird, ist nicht gut genug).

+0

+1 für Selen! –

2

Eine Sache, die Sie berücksichtigen müssen, ist der Cache. Stellen Sie sicher, dass Sie die Zeit zum Herunterladen vom Server und nicht vom Cache messen. Sie müssen sicherstellen, dass Sie das clientseitige Caching deaktiviert haben.

Beachten Sie auch das Caching auf der Serverseite. Angenommen, Sie laden das Tempo um 9:00 Uhr herunter und es dauert 15 Sekunden, dann laden Sie es um 9:05 Uhr herunter und es dauert 3 Sekunden, und schließlich um 10:00 Uhr dauert es wieder 15 Sekunden.

Was könnte passieren, dass bei 9 der Server die Seite vollständig rendern musste, da nichts im Cache war. Um 9:05 Uhr war die Seite im Cache, also musste sie nicht erneut gerendert werden. Endlich um 10 Uhr war der Cache gelöscht, so dass die Seite erneut vom Server gerendert werden musste.

Ich empfehle dringend, dass Sie das YSlow Addin für FireFox auschecken, die Ihnen eine detaillierte Analyse der Zeiten geben wird, die zum Herunterladen jedes der Elemente auf der Seite benötigt werden.

1

Ich schrieb einmal eine experimentelleprogram, die eine HTML-Seite lädt und die Objekte, die es referenziert (Bilder, iFrames, etc).

Komplizierter als es scheint, da es HTTP-Aushandlung gibt, erhalten einige Web-Clients die SVG-Version eines Bilds und einige der PNG, die in der Größe sehr unterschiedlich sind. Das gleiche gilt für <object>.

1

Ich bin oft mit einem ziemlich ähnlichen Problem konfrontiert. Ich gehe jedoch einen etwas anderen Ansatz ein: Erstens, warum sollte ich mich überhaupt für statischen Inhalt interessieren? Ich meine natürlich, es ist wichtig für den Benutzer, ob es 2 Minuten oder 2 Sekunden für ein Bild dauert, aber das ist nicht mein Problem, nachdem ich die Seite vollständig entwickelt habe. Diese Dinge sind Probleme während der Entwicklung und nach der Bereitstellung ist es nicht der statische Inhalt, aber es sind die dynamischen Dinge, die normalerweise die Dinge verlangsamen (wie du es in deinem letzten Absatz gesagt hast). Die nächste Sache ist, warum vertraust du, dass so viele Dinge konstant bleiben? Wenn jemand in Ihrem Netzwerk ein P2P-Programm startet, das Routing fehlschlägt oder Ihr ISP einige Probleme hat, werden Ihre Server-Statistiken sicherlich ausfallen. Und was sagt Ihr Benchmark für einen Nutzer, der auf der ganzen Welt lebt oder nur einen anderen ISP verwendet? Alles was ich sage ist, dass Sie Ihren Standpunkt vergleichen, aber das sagt nicht viel über die Leistung des Servers aus, oder?

Warum nicht die Site/Server selbst bestimmen, wie lange es dauerte, um zu laden? Hier ist ein kleines Beispiel in PHP geschrieben:

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>'; 
    } 
} 

Es fügt am Ende der Seite der Zeit, es zu bauen nahm zu (versteckt mit CSS). Alle paar Minuten greife ich das mit einem regelmäßigen Ausdruck und analysiere es. Wenn diese Zeit steigt, weiß ich, dass etwas nicht stimmt (einschließlich des statischen Inhalts!) Und über einen RSS-Feed werde ich informiert und kann handeln.

Mit firebug wissen wir die "normale" Leistung einer Website laden alle Inhalte (Entwicklungsphase). Mit dem Benchmark erhalten wir die aktuelle Serversituation (auch auf unserem Handy). OK. Was als nächstes? Wir müssen sicherstellen, dass alle/die meisten Besucher eine gute Verbindung bekommen. Ich finde diesen Teil wirklich schwierig und bin offen für Vorschläge. Ich versuche jedoch, die Log-Dateien zu nehmen und ein paar IP-Pings zu pingen, um zu sehen, wie lange es dauert, dieses Netzwerk zu erreichen. Zusätzlich, bevor ich mich für einen bestimmten ISP entscheide, versuche ich über die Konnektivität und die Benutzermeinungen zu lesen ...

Verwandte Themen