在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近刚刚做完一个B2C电子商务的WEB网站。现在对项目做一下总结。首先要说的就是ASP.NET的性能。 1.说到ASP.NET的性能就不能不说一下ViewState。不用我说大家也知道这个东西毕较消耗系统资源尤其是在页面数据比较多的时候。 所以最直接的做法就是在Web.Config中把ViewState禁用。到用到的时候再在页面中设置启用。其实ViewState的大小还与所用的服务器 控件的复杂程度有关,比较明显的影响性能的就是GridView。当加载很多数据的时候ViewState的值的大小是很可观的。 2. 我们在存储临时数据的时候经常用到Session,但是当服务器负担过重的时候服务器就会清除一些Session变量。所以如果我们如果存储 的是用户的购物信息,那么这是我们所不希望看到的,最好的选择就是Cookie,虽然有人说读取Cookie慢了些,但是这个影响不特别明显,所 以Cookie 是一个比较好的选择,我们可以用它来存储用户信息、购物的商品信息,这样可以减少使用Session而带来的服务器负担。不过这里 有一个小问题 就是在用户退出、或者提交订单后删除Cookie中的商品的时候,我们往往采用的是设置Cookie.Expires 属性来使得Cookie失效, 不知大家注意没有,使用C#使得Cookie失效与JavaScript使得Cookie失效的结果有时候会不一样,例如。。。一台计算机的时间不准了。。。 我们从服务器端设置过期时间,有可能就不会起作用。所以最好的办法就是在用JavaScript设置Cookie过期。从而让浏览器删除Cookie。 3.在数据库中使用大量的存储过程也会高性能,因为存储过程是在数据库服务器上编译后执行的,第一次慢一些(编译),以后就会运行的 快了。还有给表建立索引都会提高程序的整体性能。这些我都是测试过的。我曾经查询600万条记录,对于没有建立索引的执行时间是没有建立 所以使得70多倍左右。 4.最主要的影响性能的多数来自与程序本身的算法机构多数情况会发生在 A.无意中的N次拆装箱操作。 B.循环的次数太多(仅仅对于可以优化的而言,多数循环没法优化循环次数)、循环内部对象的层次过深。我在此就拿JavaScript做个例子,C#中也会有类似的情况。
function CycTest()
{ for(var i=0;i<1000;i++) { var HtmlObject=document.GetElementById("EmelentID"); HtmlObject.innerHTML="Hello World"; } }
上面这段代码优化后是
1 function CycTest()
2 { 3 var HtmlObject=document.GetElementById("EmelentID"); 4 5 for(var i=0;i<1000;i++) 6 { 7 HtmlObject.innerHTML="Hello World"; 8 } 9 10 } 5.就是缓存了,这个.NET人都知道。还有就是有一些特别常用的数据,但又几乎不变动的我们可以存储到一个XML中,读取一个XML比较比从数据库要快的多。或者干脆放到Cache里面。读内存总比读文件要快。 6.如果在一个页面上包含有多个业务逻辑操作,最好分解到多个页面中,虽然用户连续点击多个页面的时间可能会比那多个业务逻辑在一个页面中的时间要长,但是对于用户来说他在单个业务逻辑的页面是比较短的 虽然连续的总时间长了些,但是对于要处理多个业务逻辑要等待的用户体验要好的多。当然也可以使用Ajax技术来显示等待操作。ASP.NET技术对于现实数据是比较方便的,性能也是好的,但是如果涉及多次的 用户交互操作而同时伴有页面刷新最好也采用Ajax,我的观点就是能用JavaScript实现的就用JavaScript实现。我曾经做过一个在一个Repeater动态绑定一组ImageButton控件,用户在点击的时候ImageButton动态 的切换样式,可想而知,在这个网络带宽比较紧张的时代,网络不好的时候执行竟然会用3秒左右等待时间,后来换成绑定IMG 客户端HTML控件然后用JS实现样式切换效果就好多了。 7.还有一点就如果页面的代码结构比较混乱,设计页面的HTML代码比较混乱也会影响到性能。也就是有人说的“空格”有时候也会影响性能。这与ASP.NET生成控件树有关。当然如果不是特别苛求性能这一个也可以 忽略,如果我们不使用空格程序的可读性就会变差。 从宏观上面说主要的就上面这些,当然提高程序的运行效率的方法有很多,譬如在类型转换的时候是int.Prase()比Convert.ToInt32()要好,还有在使用SqlDataReader的的时候使用Sdr.getString(0)这种形式的要比Sdr["DataField"]的效率好,但是可维护性差。各种办法也是因需求不同而不同。 |
请发表评论