测试环境:SDK2.0+vs2005+Sql2000+WindowXp
建立测试工程:
新建页面,使用Web控件Repeater:
HTML页面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>使用Web控件</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <%#Eval("Comp_Name") %>-<%#Eval("Comp_ID") %><br /> </ItemTemplate> </asp:Repeater> </div> </form> <%=(System.Environment.TickCount-ts) %> </body> </html>
CS文件:
protected int ts; protected void Page_Load(object sender, EventArgs e) { ts = Environment.TickCount; string connstring = System.Configuration.ConfigurationManager.ConnectionStrings["ConnStr"].ToString(); SqlConnection myconn = new SqlConnection(connstring); SqlCommand cmd = new SqlCommand("select * from TB_Info", myconn); myconn.Open(); SqlDataReader dr = cmd.ExecuteReader(); Repeater1.DataSource = dr; Repeater1.DataBind(); dr.Close(); dr.Dispose(); myconn.Close(); myconn.Dispose(); }
按F5执行:数据量约2000条,多次测试耗时在210ms附近浮动。
新建页面,不使用Web控件
HTML代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>不使用Web控件</title> </head> <body> <form id="form1" runat="server"> <div> <%while (dr.Read()) { %> <%=dr["Comp_Name"]%>-<%=dr["Comp_ID"]%><br /> <% } %> </div> </form> <% dr.Close(); dr.Dispose(); myconn.Close(); myconn.Dispose(); %> <%=(System.Environment.TickCount-ts) %> </body> </html>
CS代码
protected int ts;
protected SqlConnection myconn;
protected SqlDataReader dr;
protected void Page_Load(object sender, EventArgs e)
{
ts = Environment.TickCount;
string connstring = System.Configuration.ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
myconn = new SqlConnection(connstring);
SqlCommand cmd = new SqlCommand("select * from TB_Info", myconn);
myconn.Open();
dr = cmd.ExecuteReader();
}
F5测试,数据量约2000条,执行时间在100MS以下。
下面截图是多次测试的数据比较:
Default.aspx是使用web控件的页面,Default2.aspx是未使用web控件的页面。从上图可以看出,不仅在执行效率上存在差距,而且在数据大小上也存在很大的差距。在使用web控件的时候,为了保存当前状态,我们在源代码中发现一个<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"> 该隐藏域所保存的数据量是相当大的,所有页面数据会存在差距。好,那么我们把页面的<form runat=“server”>删除,使得它不能存在上面的隐藏域,再进行测试。
从上图我们可以看到default.aspx页面大小变小了很多,而且速率也提升了很多,然而性能整体上还是落后于default2.aspx.而且经多次测试发现,数据量越大,该差距越明显。当数据量少时,性能相差无几,但是如果考虑同时在线人数的话,那么性能的差别又会体现出来。
总结:
有人会说default2.aspx的写法是asp写法,页面代码不能分离;没错,写法确实不怎么好看,但是效率比使用web控件的效率要高很多。Web控件最后呈现的样式也是html代码,因此个人认为在考虑性能的情况下,我们应尽量少用web控件,多使用”asp”样式来提升页面执行效率。