webForumDet fria alternativet

Tiden sidan tar att ladda

.NET

9 svar · 428 visningar · startad av Gladh

Medlem sedan maj 20012 812 inlägg
Frågan#1

Tyckte jag läste en fråga där frågeställaren undrade hur man skriver ut hur lång tid sidan tog att ladda.

Nu när jag inte hade så mycket att göra på jobbet så gjorde jag en sådan liten kodsnutt.

Skapa ett nytt Projekt där du lägger en reference till System.Web. Skapa sedan en ny klass och döp den till PageLoadingTime.cs

using System;
using System.Web;

namespace TS.HttpModules
{
	/// <summary>
	/// Summary description for PageLoadingTime.
	/// </summary>
	public class PageLoadingTime : IHttpModule
	{
		#region -- Declaration -----------------------------------------------------------------------------
		private DateTime _BeginRequestTime;
		#endregion

		#region -- Events ----------------------------------------------------------------------------------
		private void Application_BeginRequest(object sender, EventArgs e){
			//-- set beginRequest time
			_BeginRequestTime = DateTime.Now;
		}
		private void Application_EndRequest(object sender, EventArgs e){
			//-- Get timespan diffrent between BeginRequest and EndRequest
			TimeSpan timeSpan = DateTime.Now.Subtract(_BeginRequestTime);
			//-- Create a string to write out loadingtime
			System.Text.StringBuilder sb = new System.Text.StringBuilder();
			sb.Append("Page took ").Append(timeSpan.TotalSeconds).Append(" seconds to load");
			//-- write loadingTime to context
			((HttpApplication)sender).Context.Response.Write(sb.ToString());
		}
		#endregion

		#region -- Constuctor ------------------------------------------------------------------------------
		public PageLoadingTime(){}
		#endregion
		
		#region -- IHttpModule Members ---------------------------------------------------------------------
		public void Init(HttpApplication context){
			context.BeginRequest += new EventHandler(Application_BeginRequest);
			context.EndRequest += new EventHandler(Application_EndRequest);
		}

		public void Dispose(){}
		#endregion
	}
}

För att använda denna sedan på din sida så lägger du bara TS.HttpModules.dll i din bin katalog och lägger till följande i web.config

    <httpModules>
			<add name="PageLoadingTime" type="TS.HttpModules.PageLoadingTime, TS.HttpModules" />
    </httpModules>

Nu kommer texten alltid att hamla längst nere på din sida.

- Magnus

Medlem sedan juli 20022 537 inlägg
#2

Tack för koden, den kommer användas flitigt under utvecklingen av en ny sida jag håller på med. :bire

Medlem sedan maj 20012 812 inlägg
#3

Skall du bara ha tiden under utveckling så är det bättre att sätta på Tracen, som då ger dig lite mer information om vilken funktion i din kod som tar lång tid, och inte bara hur lång tid sidan tar att ladda.

- M

Medlem sedan juni 20019 024 inlägg
#4

Smat funktion, Gladh!

Ett tillägg, du kan ju spara exekveringstiden till HttpContext.Current.Items så att man kan komma åt den via andra sidor.

Medlem sedan maj 20012 812 inlägg
#5

Ett tillägg, du kan ju spara exekveringstiden till HttpContext.Current.Items så att man kan komma åt den via andra sidor.

Ger det så mycket mening, det är ju specifikt per sida, och jag kan inte komma åt den i den sidan som jag vill ha den på. Har du något bra exempel så berätta gärna, för jag missa poängen med det.

- Magnus

Medlem sedan juni 20019 024 inlägg
#6

Japp, det blir specifikt för varje http-förfrågan. Det innebär att user controls m.m. kan komma åt värdet utan att man behöver skicka över värdena.

http://aspnet.4guysfromrolla.com/articles/060904-1.aspx

r) Ser att jag skrev fel i inlägget ovan, jag menade inte att man kan komma åt den via andra sidor, utan andra delar av sidan.

Medlem sedan okt. 20005 273 inlägg
#7

Men funktionen som Gladh skrev, mäter inte den tiden som hela sidan tar att generera? Eller måste man mäta varje del av sidan??

mv icaaq

Medlem sedan maj 20012 812 inlägg
#8

Men funktionen som Gladh skrev, mäter inte den tiden som hela sidan tar att generera? Eller måste man mäta varje del av sidan??

Det var det jag trodde, nu blir jag lite osäker, kanske borde undersöka det närmare.

Om jag mäter tiden det tar att ladda sidan, så har jag ju ingen nytta av att lägga det i Items, eftersom jag aldrig kan komma åt detta objekt med min data i på samma sida, eftersom tiden först blir satt när Requesten avslutas och sidan skickas till browsern.
Det är iallafall så som jag förståt det, om det inte är så, så får ni gärna förklara hur Begin och End Request fungerar...

- Magnus

Medlem sedan juni 20019 024 inlägg
#9

Gladh skrev:

Om jag mäter tiden det tar att ladda sidan, så har jag ju ingen nytta av att lägga det i Items, eftersom jag aldrig kan komma åt detta objekt med min data i på samma sida, eftersom tiden först blir satt när Requesten avslutas och sidan skickas till browsern.

Det låter troligt det du säger, men jag vet inte hur det fungerar i praktiken. Får helt enkelt testa någon söndag man är någorlunda vaken. :)

Medlem sedan sep. 20011 914 inlägg
#10

Detta borde ge den tid det tar från det att en request kommer in till det att sidan har renderats hos klienten.

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   DateTime dt = DateTime.Now;
   System.Web.HttpContext.Current.Response.Write(dt.ToLongTimeString() + ":" + dt.Millisecond.ToString());
}
<html>
    <head>
        <title>...</title>
        <script language="javascript">
           function writeLoadTime(){
              var d = new Date();
              var s;
              s = d.getHours();
              s += ":";
              s += d.getMinutes();
              s += ":";
              s += d.getSeconds();
              s += ":";
              s += d.getMilliseconds();
              document.getElementById('lbServerTime').innerHTML = s;
          }
        </script>
    </head>
    <body onload="writeLoadTime()"></body></html>
269 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)