Asp.net网站性能优化总结[C#为例]、百度收录减少的原因[做网站请认真做内容]
Asp.net网站性能优化总结[C#为例]
最近对网站
项目收尾。整理了项目文档,看到以前对性能优化所做的标记。出于和大家共同讨论的目的,发表自己的看法。欢迎大家对此讨论,如有错误请大家指正。(此文不涉及如cahe等深层机制应用和研究,只是些肤浅应用和建议)
关于数据处理相关的优化
一、 SqlDataRead和Dataset的选择
Sqldataread优点:读取数据非常快。如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。缺点:直到数据读完才可close掉于数据库的连接
(SqlDataReader 读数据是快速向前的。SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。它使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据。DataReader需及时显式的close。可及时的释放对数据的连接。)
Dataset是把数据读出,缓存在内存中。缺点:对内存的占用较高。如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。优点:只需连接一次就可close于数据库的连接
*一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较合适.对SqlDataReader和Dataset的选择取决于程序功能的实现。
二、 ExecuteNonQuery和ExecuteScalar
对数据的更新不需要返回结果集,建议使用ExecuteNonQuery。由于不返回结果集可省掉网络数据传输。它仅仅返回受影响的行数。如果只需更新数据用ExecuteNonQuery性能的开销比较小。
ExecuteScalar它只返回结果集中第一行的第一列。使用 ExecuteScalar 方法从数据库中检索单个值(例如id号)。与使用 ExecuteReader 方法, 返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。
*只需更新数据用ExecuteNonQuery.单个值的查询使用ExecuteScalar
数据绑定的选择
三、 数据的绑定DataBinder
一般的绑定方法<%# DataBinder.Eval(Container.DataItem, "字段名") %>
用DataBinder.eval 绑定不必关心数据来源(Dataread或dataset)。不必关心数据的类型eval会把这个数据对象转换为一个字符串。在底层绑定做了很多工作,使用了反射性能。正因为使用方便了,但却影响了数据性能。
来看下<%# DataBinder.Eval(Container.DataItem, "字段名") %>。当于dataset绑定时,DataItem其实式一个DataRowView(如果绑定的是一个数据读取器(dataread)它就是一个IdataRecord。)因此直接转换成DataRowView的话,将会给性能带来很大提升。.
<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>
*对数据的绑定建议使用<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>。数据量大的时候可提高几百倍的速度。使用时注意2方面:1.需在页面添加<%@ Import namespace="System.Data"%>.2.注意字段名的大小写(要特别注意)。如果和查询的不一致,在某些情况下会导致比<%# DataBinder.Eval(Container.DataItem, "字段名") %>还要慢。如果想进一步提高速度,可采用<%# ctype(Container.DataItem,DataRowView).Row(0) %>的方法。不过其可读性不高。
以上的是vb.net的写法。在c#中:<@% ((DataRowView)Container.DataItem)["字段名"] %>
对查看页面每个执行过程状态最简单的办法:其页面的trace属性为true就可查看细节
一、使用
存储过程:
性能方面:存储过程提供了许多标准sql语言中所没有的高级特性。其传递参数和执行逻辑表达式的功能,有助于应用程序设计者处理复杂任务。另外,存储过程存储在本地服务器上,减少了执行该过程所需的网络传输宽带和执行时间。(存储过程已经对sql语句进行了预编译,所以其执行速度比在程序里执行sql语句快很多)
程序结构方面:从程序的可扩展性看,使用存储过程会对程序以后的修改带来方便。比如数据库的结构改变了,只需修改相对应的存储结构,和程序中的调用部分即可。
这部分不属于本文探讨范围,属于程序结构设计方面。所以不在此展开。
3. 程序安全性:使用存储过程可避免SQL Injection攻击。
二、查询语句的优化(针对sql server2000)
很多人只为目的写出sql语句,而不考虑sql语句的执行效率。在这我只提供一优化表顺序的方法,(sql语句的优化和原则将会在我的sql server2000学习笔记中专题讨论)
对sql语句执行效率可用sql server2000的查询分析器来查看语句的执行过程。
优化表顺序:一般情况下,sqlserver 会对表的连接作出自动优化。例如:
select name,no from A
join B on A. id=B.id
join C on C.id=A.id
where name=’wang’
尽管A表在From中先列出,然后才是B,最后才是C。但sql server可能会首先使用c表。它的选择原则是相对于该查询限制为单行或少数几行,就可以减少在其他表中查找的总数据量。绝大多数情况下,sql server 会作出最优的选择,但如果你发觉某个复杂的联结查询速度比预计的要慢,就可以使用SET FORCEPLAN语句强制sql server按照表出现顺序使用表。如上例加上:SET FORCEPLAN ON…….SET FORCEPLAN OFF 表的执行顺序将会按照你所写的顺序执行。在查询分析器中查看2种执行效率,从而选择表的连接顺序。
*使用SET FORCEPLAN选择表联结顺序
三、页面的优化(.aspx)
主要针对几个页面属性
1. EnableViewState(页面的视图状态)。如果无特殊要求设置为false。
使用ViewState ,每个对象都必须先序列化到 ViewState 中,然后再通过回传进行反序列化,因此使用 ViewState是没有代价的。尽量减少使用对象,如果可能,尽量减少放入 ViewState 中的对象的数目。下面情况基本上可以禁用viewstate:
(1)页面控件 (.ascx)
(2)页面不回传给自身。
(3)无需对控件的事件处理。
(4)控件没有动态的或数据绑定的属性值(或对于每个postpack都在代码中处理)
单个页面或每个页面都禁用 ViewState,如下所示:
单个页面:<%@ Page EnableViewState="False" %>
每个页面:在 web.config 中 <Pages EnableViewState="false" />
EnableSessionState保持默认值即可(如果页面用到sessionstate它才会占用资源)。
EnableViewStateMac如果无安全上的特殊要求,保持默认值。
2. Pagelayout.页面布局模型。建议使用Flowlayout(元素不带绝对定位属性添加).Gridlayout(绝对定位属性)由于采用绝对定位,将会比Flowlayout生产更多的代码,主要是控件的定位信息。
3.项目发布的时候切记解除页面的Debug状态。
4.Html语言的优化。我的建议是熟练掌握Html/JavaScript,少用vs.net2003自动生产的代码,它会自动生成一些无用的html代码。
5. smart navigation设置为true能让用户明显的感觉性能提高。启用此属性后对客户端和服务端影响不大.它能智能涮新需要涮新需涮新的部分.
四、控件的选择:
Html控件和服务器控件的选择。服务器控件带来的方便和功能上的实现是html控件所不能比拟的。但是是以牺牲服务器端的资源来取得的。我个人建议:如果html控件达不到所要实现的功能,而且和一些脚本语言(如javascrpt/vbscript)结合也不能实现的话。才会选择服务器控件。选择服务器控件后,也尽量对其控件优化,如取消一些页面状态等(具体看控件的优化)
服务器控件的选择:主要针对几个常用数据控件说明一下:
DataGrid:自带最强大的数据显示控件,内置了对数据的修改、删除、添加、分页等很多实用功能。如果你只需对数据显示的话,尽量不要选择DataGrid(它把数据都存储在viewstate中).也不要使用自带的分页功能,microsoft在自动分页的底层做了很多工作,虽然使用方便了,但性能开销大了。(推荐一分页控件:http://webdiyer.europe.webmatrixhosting.net/default.aspx)
DataList:比DataGrid功能少了很多。但自定义性强了很多。特有的多行数据显示,给我们带来了很多方便。DataGrid能实现的功能,它基本能实现。所以建议使用它。
Repeater:功能最少,但自定义性非常强。如果只需对数据显示,建议使用。由于减少了很多功能,对服务器的性能带来消耗最小。因此,如果是对数据显示的话,我基本上都是选择Repeater然后DataList最后DataGrid
*尽量选择html控件。能在客户端实现的功能就在客户端实现(熟练掌握javascript),减少服务器的压力。数据控件选择顺序:Repeater、DataList、DataGrid
五、服务器控件的优化:
1. Viewstate
控件的viewstate与页面的viewstate基本是一致的。用来保存控件的一些状态。
处理原则和处理页面的viewstate一样。有兴趣的可以用Datagrid绑定数据测试下
viewstate保存的数据量有多大,它所保存的数据基本和Datagrid显示的数据量大小
是等同的。
2. Ispostpack
默认false.需要产生事件的时候才需设置为true.
控件的优化,主要看你对此控件的熟悉情况。对控件内部运作的原理越了解,就会对其作出合适的优化。
百度收录减少的原因[做网站请认真做内容]
百度收录减少的原因
[题记]如果你也是正在做站的朋友,请多多关注你网站的内容,只有认真做好了内容,搜索引擎才会忠实于你的站.
百度收录减少的问题,好多站长都遇见过,最近好象严重点。最近我看到很多朋友说自己网站莫名其妙的百度收录减少,有的在还没有找到原因,没有合适的解决办法。百度收录减少也被有的朋友称呼为“百度拔毛”或者“百度割肉”如何解决百度收录减少,继续往下看。
如果是新站,出现突然减少,其实也没什么可担心的,因为baidu和google不一样.google虽然限制宽松,但是稳定,对页面有一定的要求,更新内容是逐步增加.而百度,最喜欢做的是收录新站,只要是页面都收录,然后慢慢整理.
具体的原因可能性太多,大约有几十种,把常见的原因列出来.请看下面:
(1) 网站作弊.
原因: 比如堆积关键字,隐性文字等等.如果出现这样的情况,百度就算已经收录了你,别庆幸自己蒙混过关,因为在更新的时候也会慢慢剔除的.二级域名和博客交叉连接.
解决方法:这个不用说了吧,赶快把自己的页面好好修改一下吧!另外,二级域名不要过分乱用.博客交叉连接现在无用了,里面留一两个连接就可以,多了去掉.
(2) 网站规范
原因: 标题和关键词(KeyWords)过多,有的站长喜欢把搜索相关的关键字都放进去,你放一万个也没用的.还有就是描述(Description)不合理,如果你是新站,这个绝对有用的,要设置好.
解决方法: 标题里留三四个关键字足够了,太多了百度不喜欢.建议设置为页面主题+专题名+网站名.至于关键词,你加上了没关系,但是至少页面应该出现点相关内容吧.描述的设置很简单,只要语言通顺,对页面做个大概的总结,出现两三次关键字就足够了.
(3) 网站质量
原因: 内容几乎全部采集来的,而且是采集的很热门的文章.百度突然会收录你几千页,但是百度收录后,在一定时间内,会重新检索,如果你内容没有价值的话,被丢弃.
解决方法: 采集后,稍微修改一下再发布.不要太懒,你动动手,把文章简单浏览一下,更改段落或者部分内容,至少有点和别人不一样的地方.原创的多了最好,另外在页面留个版权信息.转载的话也可以留----文章整理:XXX网站
如:http:www.zpyj.com
(4) 网站连接
原因: 网站缺少外部连接,或者外部连接逐渐减少,百度对你站的重视当然也会降低,慢慢的减少收录内容.连接的质量是很重要的.垃圾连接宁可不要!另外,检查你的页面,如果有连接指向被封的站,百度会把你当作帮助犯的.
解决方法: 检查网站外部连接,少的话就去交换,或者去一些大站大论坛发点能引起别人兴趣的帖子,留下连接.回复的人越多,效果越好. 如果站内有连接指向被封的站,尽快删除.
(5) 网站改版
原因: 网站没有修改好,就已经提交到百度,动不动来个大变化,大更新,今天这样,明天那样.分类和标题换来换去.还有时候出现测试,或者其他和网站无关的内容.
解决方法: 定位好,要做什么站就坚持下去.可以增加新的分类和内容.老的内容最好不要胡乱删除.如果你更换空间的换,最好提前换.保证在一段时间内以前的空间内容继续存在,以防万一.
(6) 网站空间
原因: 网站空间不稳定,动不动打不开网站,百度连续两次以上更新都无法抓到相信信息,那么你肯定要被从数据库清理,因为百度以为你的站已经关闭,或者相关页面不存在了.还有一个就是,你IP上多次出现作弊站点,跟着倒霉了.
解决方法: 买空间时候注意,找点信誉好的IDC.别光为了便宜,如果经常出问题,别说百度了,网民也承受不了.毕竟你的站不会引起百度重视.另外,买空间时候时候检查一下虚拟主机IP上的站点,和收录情况,以及被封闭站点的数量.
(7) 网站安全
原因: 自己的站点上加了恶意代码或者故意挂马的话,百度能分析的出来.会降低你的信任度.还有就是被那些小黑客用工具入侵,修改或者删除了大部分页面.
解决方法: 定期备份,出现问题及时解决.一般百度更新都是夜里勤快.对个人站每天更新的不多.如果一旦不正常,立刻处理,应该可以避免的.
(8) 网站优化
原因: 对SEO有一定的了解,就刻意的修改,网站做出来,过度优化,虽然没有明显作弊,但是根本没有任何价值.虽然通过百度可以得到流量,毕竟网站做出来是提供给别人浏览的,如果你回头率过低,也不行.百度不是一直提倡所谓的用户体验嘛.
解决方法: 不要过分优化,SEO的本质是为搜索引擎服务,不是欺骗.万事把握个度.打个比方说,你页面某个关键字加粗一次,百度知道是重点,可你把所有的相关关键字都加粗,百度会怎么想???!!!
(9) 网站倒霉
原因: 也许你倒霉,遇见百度大的更新或者算法改变,会很多站点一起出现收录减少或者被K.正好你的站被百度看上了.
解决方法: 没有太好的办法.只有慢慢等百度重新收录.如果你是SEO高人,也可以尽快琢磨出最新的算法给大家分享.
(10) 网站关闭
原因: 你的站点已经关闭了,但是百度还有很多相关的收录信息.论坛类比较常见.可收录却不断减少.