Posted by 欧阳振华 on 2008-10-25 16:50:38
三、配置与部署性能优化
- 网站配置
- 网站部署
- 发布前先编译.
asp.net2.0提供了预编译机制,能避免首次访问网站编译带来的性能损失.使用IDE的发布操作能很方便地进行编译.
- HTTP压缩.
在IIS中配置HTTP压缩能减少30%的网络流量.对于CPU占用不高而网络带宽有限的网站来说,可以采用压缩来减少页面加载时间.
Read the rest of this article »
Posted by 欧阳振华 on 2008-10-24 15:57:41
二、页面级别性能优化
- 页面缓存
- 视图状态:服务器使用视图状态来保存控件的状态,但是某些大数据量的服务控件(比如GridView) 会产生大量的ViewState代码,使得页面加载时间增加,网络负载增加.如果我们确信不需要和某个服务器进行交互(比如仅仅使用GridView呈现数据而没有删除和修改操作),就可以通过设置控件的EnableViewState属性为False来关闭控件的视图状态.甚至你可以关闭整个页面的视图状态.
- <%@page EnableViewState="false"%>
除此之外,不推荐在ViewState中保存大量数据.可能初学者一时不知道 ViewState是什么东西,那么我就以我的博客为例,先打开首页的ViewState,(因我的首页没有用到交互,所以ViewState是关闭的).打开ViewState后,我们用IE浏览器来看看网页的源代码:
.jpg)
这就是滥用ViewState的结果,这些没有用的数据在浏览器之间往返,占用了大量的网络流量.而关闭页的的ViewState后,再来看页面的源代码:

我们看到,页面就"干净"了很多. 只有一些必要的HTML代码.
Read the rest of this article »
Posted by 欧阳振华 on 2008-10-24 8:22:44
KaiBo现在已采用成员资格管理机制,类似于MS提供的成员资格管理,所以博客里的文章及相册将会划分为公开和相对于没有注册用户的隐藏.要想查看所有的内容,只要注册就可以了.例如没有登陆的用户与登陆的用户看到的文章分类的区别如下图所示:
.jpg)
当然了,由于博客现在是刚刚开始起步,所以博客里的内容暂时没有分权查看.文件的下载现只为注册用户提供.所以需要下载文件的朋友请花点时间去注册.
Read the rest of this article »
Posted by 欧阳振华 on 2008-10-23 19:39:38
一个刚入门的初学者开发一个网站后,能从哪些方面对系统的性能进行提升呢?
- 编码级别.这个是最小的级别,可能也是对性能的提升产生效果最小的.不过,我们需要特别注意一些宝贵的资源释放,往往这些错误在测试的时候不容易发现,系统一旦上线接受高访问量的考验就崩溃了.
- 页面级别.对于WEB系统来说,页面是一个很重要的一部分,客户端和服务端就是通过静态的HTML,JS等代码进行交互的.页面的缓存策略,页面的大小直接决定了客户端讯问网站的速度和网络流量.页面级别的性能优化比编码级别更有效一点.
- 构架级别.一个好的构架能提升系统性能,而构架也可能成为整个系统的杀手.对于分布式的系统更是如此.如果在一个环节发生了问题就可能导致整个系统的性能产生明显巨大的问题.
- 配置与部署.一个同样的系统可能在两个相同硬件配置的服务器上产生明显的性能差异.由于网站是需要IIS进行解析的,换句话说,网站所有的流量都要经过IIS这个关口,如果IIS的配置不当的话,对网站造成的影响是致命的.
下面,我将就这几个方面介绍网站性能优化的一个具体做法,当然,方法并不是绝对的,所有方法都仅供参考.其中很多的方法我也是从一些网站性能优化的书上摘抄下来的.
一、编码级别的优化.
- 数据连接.
- 尽量晚打开连接,尽量早关闭连接.
- 优化SQL语句或者存储过程,尽量缩短查询运行时间
下面两个连接方法就有很大的差别:
- SQLConnection conn=new SQLConnection(".....");
- //打开连接
- conn.open();
- SqlCommand cmd=new SqlCommand("....",conn);
- ...
- ...
- cmd.ExecuteNonQuery();
- //关闭连接
- conn.Close();
- SQLConnection conn=new SQLConnection(".....");
- SqlCommand cmd=new SqlCommand("....",conn);
- ...
- ...
- //打开连接
- conn.open();
- cmd.ExecuteNonQuery();
- //关闭连接
- conn.Close();
上面的第一种方法就是过早的打开了数据连接,这样是非常消耗资源的,要像第二种方法样,在要执行查询的时候才打开连接.
- 数据查询
- Select记录的时候,只返回需要的字段,不要Select * 把所有的字段都返回,数据越多对于服务器的压力就越大.对于分布式程序还会占用更多的网络流量.
- 不要一次取出所有行,仅取出当前页面需要的数据,这就涉及到分页了.
- 尽量使用DataReader来进行数据读取,DataReader是只读向前形式读取数据的,性能要比Dataset高.
- 使用DataReader的时候,尽量一次返回多个记录集,需不是为每个记录打开一次数据库.
- 如果需要在一个代码段中执行多个SQL语句,可以使用存储过程来优化性能.
- 释放资源
- 其它优化
- 不要依赖异常.异常是不可知的错误,
- 使用泛型集合代替普通的集合. net2.0以上提供了很多泛型集合,使用泛型集合代替普通集合能提高性能.比如下面的代码耗时2908毫秒:
- ArrayList list=new ArrayList();
- for(int i=0;i<10000000; i++)
- list.add(i);
- int count=0;
- for(int i=0;i<list.Count;i++)
- count=(int)list[i];
改用泛型集合后代码耗时只用370毫秒
- List<int> list=new List<int>();
- for(int i=0;i<10000000; i++)
- list.add(i);
- int count=0;
- for(int i=0;i<list.Count;i++)
- count=(int)list[i];
- 不要大量使用反射,反射虽能减少项目依赖,但是会有比较大的性能损失,不推荐大量使用.
Read the rest of this article »
Posted by 欧阳振华 on 2008-10-3 8:46:20
- select CONVERT(varchar(12) , getdate(), 101 )
- 09/12/2004
-
- select CONVERT(varchar(12) , getdate(), 103 )
- 12/09/2004
-
- select CONVERT(varchar(12) , getdate(), 104 )
- 12.09.2004
-
- select CONVERT(varchar(12) , getdate(), 105 )
- 12-09-2004
-
- select CONVERT(varchar(12) , getdate(), 106 )
- 12 09 2004
-
- select CONVERT(varchar(12) , getdate(), 107 )
- 09 12, 2004
-
- select CONVERT(varchar(12) , getdate(), 108 )
- 11:06:08
-
- select CONVERT(varchar(12) , getdate(), 109 )
- 09 12 2004 1
-
- select CONVERT(varchar(12) , getdate(), 110 )
- 09-12-2004
-
- select CONVERT(varchar(12) , getdate(), 113 )
- 12 09 2004 1
-
- select CONVERT(varchar(12) , getdate(), 114 )
- 11:06:08.177
Read the rest of this article »
Posted by 欧阳振华 on 2008-9-29 18:27:26
DateTime dt = DateTime.Now;
Label1.Text = dt.ToString();//2005-11-5 13:21:25
Label2.Text = dt.ToFileTime().ToString();//127756416859912816
Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816
Label4.Text = dt.ToLocalTime().ToString();//2005-11-5 21:21:25
Label5.Text = dt.ToLongDateString().ToString();//2005年11月5日
Label6.Text = dt.ToLongTimeString().ToString();//13:21:25
Label7.Text = dt.ToOADate().ToString();//38661.5565508218
Label8.Text = dt.ToShortDateString().ToString();//2005-11-5
Label9.Text = dt.ToShortTimeString().ToString();//13:21
Label10.Text = dt.ToUniversalTime().ToString();//2005-11-5 5:21:25
Label1.Text = dt.Year.ToString();//2005
Label2.Text = dt.Date.ToString();//2005-11-5 0:00:00
Label3.Text = dt.DayOfWeek.ToString();//Saturday
Label4.Text = dt.DayOfYear.ToString();//309
Label5.Text = dt.Hour.ToString();//13
Label6.Text = dt.Millisecond.ToString();//441
Label7.Text = dt.Minute.ToString();//30
Label8.Text = dt.Month.ToString();//11
Label9.Text = dt.Second.ToString();//28
Label10.Text = dt.Ticks.ToString();//632667942284412864
Label11.Text = dt.TimeOfDay.ToString();//13:30:28.4412864
Label1.Text = dt.ToString();//2005-11-5 13:47:04
Label2.Text = dt.AddYears(1).ToString();//2006-11-5 13:47:04
Label3.Text = dt.AddDays(1.1).ToString();//2005-11-6 16:11:04
Label4.Text = dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
Label5.Text = dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
Label6.Text = dt.AddMonths(1).ToString();//2005-12-5 13:47:04
Label7.Text = dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
Label8.Text = dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
Label9.Text = dt.AddTicks(1000).ToString();//2005-11-5 13:47:04
Label10.Text = dt.CompareTo(dt).ToString();//0
Label11.Text = dt.Add(?).ToString();//问号为一个时间段
Label1.Text = dt.Equals("2005-11-6 16:11:04").ToString();//False
Label2.Text = dt.Equals(dt).ToString();//True
Label3.Text = dt.GetHashCode().ToString();//1474088234
Label4.Text = dt.GetType().ToString();//System.DateTime
Label5.Text = dt.GetTypeCode().ToString();//DateTime
Label1.Text = dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25
Label2.Text = dt.GetDateTimeFormats('t')[0].ToString();//14:06
Label3.Text = dt.GetDateTimeFormats('y')[0].ToString();//2005年11月
Label4.Text = dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日
Label5.Text = dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05
Label6.Text = dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05
Label7.Text = dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日
Label8.Text = dt.GetDateTimeFormats('M')[0].ToString();//11月5日
Label9.Text = dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06
Label10.Text = dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06
Label11.Text = dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT
Label1.Text = string.Format("{0:d}",dt);//2005-11-5
Label2.Text = string.Format("{0:D}",dt);//2005年11月5日
Label3.Text = string.Format("{0:f}",dt);//2005年11月5日 14:23
Label4.Text = string.Format("{0:F}",dt);//2005年11月5日 14:23:23
Label5.Text = string.Format("{0:g}",dt);//2005-11-5 14:23
Label6.Text = string.Format("{0:G}",dt);//2005-11-5 14:23:23
Label7.Text = string.Format("{0:M}",dt);//11月5日
Label8.Text = string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
Label9.Text = string.Format("{0:s}",dt);//2005-11-05T14:23:23
Label10.Text = string.Format("{0:t}",dt);//14:23
Label11.Text = string.Format("{0:T}",dt);//14:23:23
Label12.Text = string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
Label13.Text = string.Format("{0:U}",dt);//2005年11月5日 6:23:23
Label14.Text = string.Format("{0:Y}",dt);//2005年11月
Label15.Text = string.Format("{0}",dt);//2005-11-5 14:23:23?
Label16.Text = string.Format("{0:yyyyMMddHHmmssffff}",dt); //yyyymm等可以设置,比如Label16.Text = string.Format("{0:yyyyMMdd}",dt);
Read the rest of this article »