最近管理的网站时常出现不能访问的情况,是在很郁闷.
BD:"为什么淘宝的页面就能那么快的显示,而我们的怎么2分钟还不出来了?"
CS:"如果持续这样子,会员会失去信心的."
可郁闷死我啦.
经理也催着啊,于是百度什么的都用上了.对于我这样的菜鸟还只能用这个,⊙﹏⊙b汗
下面是我从孟子的书上面摘下来的
与程序相关的性能:
1.缓存 [频繁访问的数据和需要大量处理时间来创建的数据存储在内存中]
遵循的规则:1)在页面中将静态内容和动态内容分割开来.考虑将动态内容作成用户控件;
2)缓存合理的数据.服务器资源有限,应当缓存应用程序级的数据,多个用户共同使用的数据,静态数据,生成数据需要很大开销的动态数据,DataSet以及自定义的对象等.不要缓存数据库连接对象,不要缓存DataReader.
3)选择适当的方式. 如果要缓存的是页面的展现结果,可以使用页面指令进行缓存.如果缓存的展现结果在别的地方也能用到,可以使用Cache提供的API.
2.视图状态 [_VIEWSTATE表单隐藏域]
1)如果不需要视图状态,请禁用它.如果页面不进行PostBack,如果不处理服务器控件的时间,如果服务器控件的数据每次都需要重新计算,则没有必要使用视图状态.
2)尽量减少视图状态中存放的对象. 不要在视图状态中存放大对象.不要存放基本类型之外的对象,它会花费大量的资源进行类型装换或者序列化.
3.关于页面处理
1)尽量减少页面文件的大小. 将CSS和脚本村委单独的文件,去除页面中不必要的Tab控制符和空格,不要将多个任务放在一个页面中,不要指定服务器控件的ID数据为比较长的字符串[例如,具有嵌套布局的DataGrid和Repeator等,因为它会产生较长的客户端HTML的id属性].
2)通过检测Page.IsPostBack减少代码执行的数据.
3)禁止使用Debug="true",减少页面生成过程中生成额外的调试信息.
4)使用Server.Transfer而不使用Response.Redirect ,减少服务器和客户端之间的往返.
5)尽量使用客户端验证,减少服务器和客户端之间的往返.
6)在适当的场合使用服务器控件. 如果不需要回发保持状态,如果显示的数据是静态数据,如果不需要在服务器端用代码访问控件,如果不要回发处理,如果显示的是只读数据,可以考虑不使用.
7)尽量避免嵌套的服务器控件.
4.避免使用Page.DataBind[页面上所有服务端控件执行一个DataBind方法]和DataBinder.Eval[如果没有必要,请指定特定控件的DataBind方法]
DataBind.Eval方法使用反射来获得参数,尽量少哦用该方法.可以使用类型装换进行处理或者使用ItemDataBound事件.例如,尽量不使用以下形式:


<ItemTemplate>
<tr>
<td><%# DataBinder.Eval(Container.DataItem,"字段1"%></td>
</tr>
</ItemTemplate>
而使用:


<ItemTemplate>
<tr>
<td><%#((DataRowView)Container.DataItem)["字段1"]%></td>
</tr>
</ItemTemplate>
或者(对于DataReader数据源来说):


<ItemTemplate>
<tr>
<td><%#((DbDataRecord)Container.DataItem).GetString(0)%></td>
</tr>
</ItemTemplate>
5.关于Application对象和Session对象
1)使用静态属性存储数据而不使用Application对象,在Application对象里存储只读类型的数据都将会提高性能.
2)尽量使用InProc模式的Session,这个模式是最快的.
3)在Session里存储基本类型的数据减少序列化所消耗的资源.
4)如果不使用Session,请使用EnableViewState="false"禁用它,如果不修改Session,请尽量使用ReadOnly属性设置.
6.关于字符串操作
1)尽量使用Response.Write将结果输出到浏览器,这个方法最快,不要将字符串连接在一起一次输出.
2)在字符串端并且小的情况下可以使用String.Concat方法,而在字符串长度未知,并且字符串大的情况下,使用StringBuilder对象
3)不要使用strVar==""来判断字符串是否为"".这样它会创建额外的字符串,而使用strVal==String.Empty或者strVal.Length==0来判断
4)String.Compare方法进行字符串的比较
7.数据访问
1)尽量使用存储过程返回数据,不要直接在代码中进行查询.
2)在数据库中返回游泳的数据结果,不要选择不使用的数据字段
3)进行使用DataReader进行数据绑定,DataReader是单向只读的
4)尽量一次返回多个记录集而不是每个记录集分别打开一次数据库连接进行查询
5)使用Close或者Dispose方法关闭数据库连接.尽量使用using语句关闭数据库连接,如果使用DataReader,则指明CommandBehavior.CloseConnectin参数
6)使用连接池提高性能:不要变动连接字符串,不要将连接进行缓存或者放置在Application对象中,尽量使用少的用户登陆数据库,不要每个用户登陆一次,当使用连接池时,关闭连接并不是关闭物理连接,而是将连接返回给连接池供其他用户使用,因此应尽早地关闭连接.
7)使用ExecuteNonQuery方法执行不需要返回数据的操作;使用ExecuteScalar方法返回单个结果的操作;CommandBehavior.SequentialAccess返回二进制数据或者大数据
8)如果多次相同的查询,请使用Command.Prepare方法
9)使用GetOrdinal方法预先得到索引值,使用索引值比使用字符串的列名查询数据效率更高.
8.代码优化
1)解析基本数据时,使用Try方法如果解析失败,会抛出异常,使用TryParse方法则只执行Else下的语句.TryParse的性能比Try的好
2)使用AppendAllText,WriteAlllBytes,WriteAllLines,WriteAllText,ReaderAlllBytes,ReadAllLines,ReaderAllText方法读写文件内容
3)遍历数据时,不要使用 i<arr.Length,每循环一次,计算一次arr.Length属性.单独运算
4)避免在循环里创建对象
5)减少装箱的次数,如果要在多次进行类型装换,请先定义一个变量.例如:


int i=123;
object box;
box=(object)i;
//下面多次使用变量box
6)使用for循环代替foreach循环