您的位置:首页 > 其它

提高Web应用程序的性能--我的一次优化经历

2007-08-24 15:51 706 查看
总是看见好些asp,php的Web应用程序跑得比.net的要快,我个人就曾做过一些网站,但是运行起来远不如微软宣传的那么好,暂且不论服务器的配置等原因,单从php与asp等脚本解释执行,其性能理论上应该低于.net的编译执行,但是Web开发一块的主流仍是asp,jsp,php.而.net的市场占有率相对较小,究其原因,我想可能有多方面的原因吧!

不管怎样,我仍推崇.net,因为.net在程序的可读性,程序架构,程序重用性,扩展性,程序维护性方面以及对OOP的绝对支持大大强于asp,php.而且我相信真正懂.net,的程序员定能发挥.net的无穷威力,好了,废话少说,说说我做站点时遇到的一次优化经历!好让有相同经历的人得到点启发,我就很欣慰了!

<%@ Page MasterPageFile="~/MasterPage.master" %>
<%@ Register Src="~/Control/RecommendFile.ascx" TagName="Recommend" TagPrefix="ED" %>

<%@ Register Src="~/Control/LatelyUpdated.ascx" TagName="Newly" TagPrefix="ED" %>

<%@ Register Src="~/Control/CommonColumn.ascx" TagName="Column" TagPrefix="ED" %>

<%@ OutputCache Duration="40" Location="Any" VaryByParam="*" %>

<asp:Content ContentPlaceHolderID="rightMain" runat="server" ID="content1">

<div id="right">

<div id="new">

<div id="newTitle">

</div>

<div id="newContent">

<ED:Newly ID="newly" runat="server"></ED:Newly>

</div>

</div>

<div id="pictures">

<ED:Recommend ID="r1" runat="server" DisplayNum="2"/>

</div>

<div id="allSoftware">

<div id="allSoftwareTitle">

<img alt="allsoftware" src="images/allsoftware.jpg" />

</div>

<div id="allSoftwareContent">

<div class="softItem">

<ED:Column ID="c1" runat="server" ColumnId="1" />

</div>

<div class="softItem">

<ED:Column ID="Column1" runat="server" ColumnId="2" />

</div>

<div class="softItem">

<ED:Column ID="Column2" runat="server" ColumnId="3" />

</div>

<div class="softItem" style="width: 179px;">

<ED:Column ID="Column3" runat="server" ColumnId="4" />

</div>

<div class="softItem">

<ED:Column ID="Column4" runat="server" ColumnId="5" />

</div>

<div class="softItem">

<ED:Column ID="Column5" runat="server" ColumnId="6" />

</div>

<div class="softItem">

<ED:Column ID="Column6" runat="server" ColumnId="7" />

</div>

<div class="softItem" style="width: 179px;">

<ED:Column ID="Column7" runat="server" ColumnId="8" />

</div>

</div>

</div>

</div>

</asp:Content>

以上是最初根据美工界面的设计设计的程序.不知大家有没看到,软件栏目下有多个栏目引用了相同的Column控件,而每个Column控件都要连接2次数据库(1是查询栏目表得到文件类型名称;2是查询文件表得到该类型下的文件数据)才获得数据源,这样总共就要连接16次数据库,MyGod!这还得了,如果再加上访问人数多一点,那数据库的性能负荷将会非常地大,所以,这种程序只能说实现了基本的功能,但是在性能方面会有很大的改进,这也是有些Web应用程序运行效率不够高的原因:其实 <div class="softItem">

<ED:Column ID="c1" runat="server" ColumnId="1" />

</div>

<div class="softItem">

<ED:Column ID="Column1" runat="server" ColumnId="2" />

</div>

<div class="softItem">

<ED:Column ID="Column2" runat="server" ColumnId="3" />

</div>

<div class="softItem" style="width: 179px;">

<ED:Column ID="Column3" runat="server" ColumnId="4" />

</div>

<div class="softItem">

<ED:Column ID="Column4" runat="server" ColumnId="5" />

</div>

<div class="softItem">

<ED:Column ID="Column5" runat="server" ColumnId="6" />

</div>

<div class="softItem">

<ED:Column ID="Column6" runat="server" ColumnId="7" />

</div>

<div class="softItem" style="width: 179px;">

<ED:Column ID="Column7" runat="server" ColumnId="8" />

</div>

上述代码完全可以整合为一个独立的控件,这样连接数据库的次数将会减少到2次,相比原始的做法连接16次数据库,将会有很大的提高.具体做法是通过查询"栏目表"和"文件表"得到所需数据然后将其格式化为html的字符串,用一控件呈现出来,然后被首页调用.

即:

1.整合控件的后台代码:

public partial class Control_ColumnFile : System.Web.UI.UserControl

{

private Int32 columnNum;

public Int32 ColumnNum

{

set { columnNum = value; }

}

protected String OutPutColumnFileStr()

{

String queryStr = String.Format("select top {0} * from [Column]", columnNum);

IList<Column> clist = Columns.GetColumnList(queryStr);

DataSet ds=Files.GetColumnFile(clist);

StringBuilder sb = new StringBuilder();

for(int i=0;i<clist.Count;i++)

{

sb.AppendFormat("<div class=\"softItem\"></div><div class=\"softItemTitle\">{0}</div><div class=\"softItemContent\"><ul>",clist[i].Name);

for(int j=0;j<ds.Tables[i].Rows.Count;j++)

{

sb.AppendFormat("<li><a href=\"down.aspx?Id={0}\">{1}</a></li>",Convert.ToInt32(ds.Tables[i].Rows[j]["File_ID"]),ds.Tables[i].Rows[j]["File_Name"].ToString());

}

sb.Append("</ul></div>");

}

return sb.ToString();

}

}

2.函数调用

public static DataSet GetColumnFile(IList<Column> clist)

{

DataProvider dp = DataProvider.Instance();

DataSet ds = dp.GetColumnFileDataSet(clist);

return ds;

}

3.根据栏目集合返回所有栏目文件的数据集

public override DataSet GetColumnFileDataSet(IList<Column> clist)

{

DataSet ds = new DataSet();

String basicQueryStr = "select * from [File] where [Column_ID]=";

using (DbConnection conn = new OleDbConnection(ConnString()))

{

using (DbCommand comm = conn.CreateCommand())

{

comm.CommandType = CommandType.Text;

conn.Open();

for (int i = 0;i<clist.Count; i++)

{

String queryStr = basicQueryStr + clist[i].Column_ID.ToString();

comm.CommandText = queryStr;

IDataReader dr = comm.ExecuteReader();

DataTable dt = new DataTable();

dt.Load(dr);

ds.Tables.Add(dt);

}

}

}

return ds;

}

这样我们将会在首页得到格式化的HTML字符串,达到同样的显示效果,但是却大大提高了Web应用的效率.

 后记:写完这篇真是汗颜,做一个程序员不难,但做一个优秀的程序员却不简单,以前自己总是认为实现功能即可,但是这是远远不够的,真正优秀的程序员,会近乎苛刻的审核自己写的每行代码,不断地优化程序,优化性能,这才是我们所必须学习和追求的.朝优秀的程序员努力!!!加油
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: