总是看见好些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应用的效率.
 后记:写完这篇真是汗颜,做一个程序员不难,但做一个优秀的程序员却不简单,以前自己总是认为实现功能即可,但是这是远远不够的,真正优秀的程序员,会近乎苛刻的审核自己写的每行代码,不断地优化程序,优化性能,这才是我们所必须学习和追求的.朝优秀的程序员努力!!!加油
posted on 2007-08-24 15:51  钰狼  阅读(220)  评论(0编辑  收藏  举报