计算出你页面执行的时间 ASP.NET

简介:

本文将叙述如何计算出ASP.NET页面执行所需要的时间,当项目较大的时候有时候可能出现一些莫明其妙的错误,这可能是性能上的瓶颈或者是某些BUG引发的(比如<img src="" />,会引起两次访问你的服务资源),这时我们需要计算出每个时间执行的时间以便排查出引发项目出现性能异常的页面。

 

第一步:建立所有页面的基类

PageBase.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Text;
using System.IO;
/// <summary>
/// PageBase 的摘要说明
/// </summary>
public class PageBase : Page
{
public PageBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region Overriden
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//计算时间执行时间
if (this.MeasureExecutionTime)
{
watch = new System.Diagnostics.Stopwatch();
watch.Start();
this.RecordTimeStamp("页面开始执行……");
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}
protected override void OnPreRenderComplete(EventArgs e)
{
base.OnPreRenderComplete(e);
if (this.MeasureExecutionTime)
{
this.RecordTimeStamp("Page execution complete...");
watch.Stop();
Control addExecutionTo = this.Form;
if (addExecutionTo == null)
addExecutionTo = this;
addExecutionTo.Controls.Add(new LiteralControl("<br /><br />"));
StringBuilder timestampsOutput = new StringBuilder(50 * this.ExcutionTimeStamps.Count);
for (int i = 0; i < this.ExcutionTimeStamps.Count; i++)
timestampsOutput.AppendFormat("<b>Timestamp {0}</b>: {1:N0} ms ({2})<br />{3}",
i + 1, this.ExcutionTimeStamps[i].TimeStamp,
this.ExcutionTimeStamps[i].Description, Environment.NewLine);
addExecutionTo.Controls.Add(new LiteralControl(timestampsOutput.ToString()));
}
}
#endregion
#region Members
#endregion
#region FindControlRecursive  迭代查找控件
protected virtual Control FindControlRecursive(string id)
{
return FindControlRecursive(id, this);
}
/// <summary>
/// 迭代查找控件
/// </summary>
/// <param name="id">查找控件的编号</param>
/// <param name="parent">控件容器</param>
/// <returns>Control</returns>
protected virtual Control FindControlRecursive(string id, Control parent)
{
// if parent is the control we're looking for, return it
if (string.Compare(parent.ID, id, true) == 0)
return parent;
//search through children
foreach (Control child in parent.Controls)
{
Control match = FindControlRecursive(id, child);
if (match != null)
return match;
}
//if we reach here then no control width id was found.
return null;
}
#endregion
#region ExecutionTime 执行时间
/// <summary>
/// 是否开启计算页面计算时间
/// </summary>
public virtual bool MeasureExecutionTime
{
get {
object o = ViewState["MeasureExecutionTime"];
return o == null ? false : (bool)o;
}
set {
ViewState["MeasureExecutionTime"] = value;
}
}
private System.Diagnostics.Stopwatch watch = null;
private List<TimeStampInfo> timeStamps = null;
/// <summary>
/// 页面执行时间集合
/// </summary>
protected virtual List<TimeStampInfo> ExcutionTimeStamps
{
get {
if (timeStamps == null)
timeStamps = new List<TimeStampInfo>();
return timeStamps;
}
}
/// <summary>
/// 记录页面执行时间
/// </summary>
/// <param name="desc"></param>
protected virtual void RecordTimeStamp(string desc)
{
if (watch == null)
throw new ArgumentException("要记录页面的执行时间 MeasureExecutionTime 必须设置为 true.");
ExcutionTimeStamps.Add(new TimeStampInfo(watch.ElapsedMilliseconds,desc));
}
#endregion
}
 
首先用一个变量MeasureExecutionTime来保存页面是否需要计算出执行的时间,然后重写页面的OnInit事件 ,当需要计算页面执行的时间则启动Stopwatch。
最后在OnPreRenderComplete中输出计算的结果。
 

第二步:建立需要计算页面执行时间的页面

其页面的测试如下:
Default.aspx.cs
 
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default :PageBase
{
protected void Page_Init(object sender, EventArgs e)
{
base.MeasureExecutionTime = true;
}
protected void Page_Load(object sender, EventArgs e)
{
// Record timestamp
base.RecordTimeStamp("Starting long running process");
// Do long running process
Random rnd = new Random();
System.Threading.Thread.Sleep(rnd.Next(1000) + 1000);
if (!IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Name");
for (int i = 0; i < 20; i++)
{
DataRow dr = dt.NewRow();
dr["ID"] = i;
dr["Name"] = "Name" + i.ToString();
dt.Rows.Add(dr);
dt.AcceptChanges();
}
gv.DataSource = dt;
gv.DataBind();
}
// Record timestamp
base.RecordTimeStamp("Completed long running process");
}
}
转载请注明出处[ http://samlin.cnblogs.com/] 
作者赞赏
 


刚做的招标网: 八爪鱼招标网 请大家多意见
分类:  ASP.Net

本文转自Sam Lin博客博客园博客,原文链接:http://www.cnblogs.com/samlin/archive/2010/01/17/Excute-ASP-NET-Page-Time.html,如需转载请自行联系原作者
目录
相关文章
|
JavaScript 前端开发
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
1727 0
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
|
JavaScript
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
|
9月前
|
开发框架 数据可视化 前端开发
ASP.NET Core MVC+Quartz实现定时任务可视化管理页面
ASP.NET Core MVC+Quartz实现定时任务可视化管理页面
327 0
|
10月前
|
开发框架 JavaScript .NET
Asp.net C#页面传参的几种方式
Asp.net C#页面传参的几种方式
107 0
|
11月前
mvc.net分页查询案例——前台页面(Index.aspx)
mvc.net分页查询案例——前台页面(Index.aspx)
47 0
|
开发框架 JSON 前端开发
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
在开发一个网站项目时,异常处理和过滤功能是最基础的模块 本篇文章就来讲讲,如何自定义全局异常类来统一处理
204 0
|
开发框架 程序员 API
【C#】.net core2.1,通过扩展状态代码页方法对404页面进行全局捕抓并响应信息
在开发一个网站项目时,除了异常过滤功能模块,还需要有针对404不存在的api接口和页面处理功能 本篇文章就来讲讲,如何自定义全局请求状态类来统一处理
184 0
|
开发框架 .NET Windows
真正解决ASP.NET每一个页面首次访问超级慢的问题
真正解决ASP.NET每一个页面首次访问超级慢的问题
217 0
|
开发框架 .NET C#
mvc.net分页查询案例——前台页面(Index.aspx)
mvc.net分页查询案例——前台页面(Index.aspx)
53 0