提高网站性能的方法
1、緩存 對那些經(jīng)常使用的數(shù)據(jù)和需要大量的時間來創(chuàng)建的數(shù)據(jù)可以存儲在內(nèi)存中,后來的請求直接使用,不需要在從新生成, 使用方法很簡單: <%@OutputCache VaryByParams="none" Duration="120"%> 使用緩存的原則: 1)在頁面中靜態(tài)的內(nèi)容和動態(tài)的內(nèi)容分割開來。 可以把動態(tài)內(nèi)容單獨出來,做成用戶控件 2)緩存合理的數(shù)據(jù) 并不是所有的數(shù)據(jù)內(nèi)容都進(jìn)行緩存就能提高性能的,由于服務(wù)器的資源是有限的,緩存不適當(dāng)?shù)臄?shù)據(jù)反而會降低性能,應(yīng)當(dāng)緩存的應(yīng)該是應(yīng)用程序級的數(shù)據(jù),多個用戶 共同使用的數(shù)據(jù),靜態(tài)數(shù)據(jù),生成數(shù)據(jù)需要開銷很大的數(shù)據(jù),DataSet以及自定義的對象等,不要緩存數(shù)據(jù)庫連接對象,不要緩存DataReader. 3)選擇適當(dāng)?shù)姆绞? /// 2、視圖 1)如果不需要用視圖請禁用它, 視圖狀態(tài)默認(rèn)是允許的,如果頁面不進(jìn)行Postback如果不處理服務(wù)器控件事件,可以禁用它 2)盡量減少視圖狀態(tài)中存放的對象 不要在視圖狀態(tài)中存放大量的對象。 ///
頁面處理 1)盡量減少頁面文件的大小 將CSS和腳本存為單獨的文件,不要將多個任務(wù)放在同一個頁面中,不要指定服務(wù)器控件的ID數(shù)據(jù)位比較長的字符串 2)通過Page.IsPostBack減少代碼的執(zhí)行數(shù)量。 3)禁用Debug="true" 減少頁面生成額外的調(diào)試信息, 4)使用Server.Transfer而不使用Response.Redirect 5)盡量使用客戶端驗證,減少使用服務(wù)器端的驗證,減少服務(wù)器和客戶端之間的往返。 6)在適當(dāng)?shù)臅r候使用客戶端服務(wù)器控件 如果不需要在回發(fā)時保持狀態(tài),如果顯示的數(shù)據(jù)是靜態(tài)數(shù)據(jù),如果不需要自愛服務(wù)器端用代碼訪問控件,如果不需要回發(fā)處理,如果顯示的是只讀數(shù)據(jù),就可以考慮不使用 服務(wù)器控件。 7)盡量避免嵌套服務(wù)器控件。
/ 避免使用Page.DataBind和DataBinder.Eval Page.DataBind執(zhí)行時會將頁面中所有的服務(wù)器控件執(zhí)行一次DataBind方法,如果沒有必要就不要使用。 DataBinder.Eval方法是使用反射來獲取參數(shù)的。盡量少使用, 盡量不要使用: <ItemTemplate> <tr> <td><%#DataBinder.Eval(Container.DataItem,"字段一"))%></td> <td><%#DataBinder.Eval(Container.DataItem,"字段一"))%></td> </tr> </ItemTemplate> 而使用: <ItemTemplate> <tr> <td><%#(DataRowView)Container.DataItem["字段1"]%></td> <td><%#(DataRowView)Container.DataItem["字段1"]%></td> </tr> </ItemTemplate>
/ 關(guān)于Application和Session對象 1)盡量使用InProc模式的Session這個模式最快 2)在Session里存儲基本類型的書減少序列化所消耗的資源 3)如果不用Session,請使用EnableViewState=“false”禁用它 4)如果不修改Session變量,請用ReadOnly屬性設(shè)置
/ 關(guān)于字符串操作 1)盡量使用Response.Writ將結(jié)果輸出,這種方法是最快的。不要將字符串連接在一起一次輸出 2)在字符串短并且少的情況使用String.Concat方法,在字符串長度未知,并且比較長的情況下使用SringBuilder對象 3)不要使用StrVar==""來判斷字符串是否為空,這樣會產(chǎn)生額外的字符串,請使用StrVar==String.Empty代替,或者使用StrVar.Length==0來判斷 4)請使用String.Compare方法來比較字符串 關(guān)于數(shù)據(jù)訪問 1)盡量使用存儲過程返回數(shù)據(jù) 2)在數(shù)據(jù)庫中只返回有用的數(shù)據(jù)結(jié)果,不要選擇不使用的數(shù)據(jù)字段。 3)進(jìn)行使用DataReader進(jìn)行數(shù)據(jù)綁定,DataReader是單向只讀的。 4)盡量一次返回多個記錄集,而不是每個記錄集分別打開一次數(shù)據(jù)庫連接進(jìn)行查詢。 5)盡量晚的打開數(shù)據(jù)庫連接,盡量早地關(guān)閉數(shù)據(jù)庫連接,(盡量使用using語句關(guān)閉數(shù)據(jù)庫連接,) 6)使用連接池提高網(wǎng)站性能,不要變動數(shù)據(jù)庫連接字符串,不要將連接進(jìn)行緩存或者放置在Application對象中,當(dāng)使用連接池時,關(guān)閉連接并不是物理連接, 而是將連接返回給連接池供別的用戶使用,因此應(yīng)該盡量早的關(guān)閉連接, 7)使用ExecuteNonQuery返方法執(zhí)行不返回數(shù)據(jù)的操作,使用ExectueScalar方法返回單個結(jié)果的操作, 使用CommandBehavior.SequentialAccess返回二進(jìn)制數(shù)據(jù)或者大數(shù)據(jù)。 8)如果多次相同查詢,使用Command.Prepare方法。 9)使用GetOrdinal方法預(yù)先得到索引值,使用縮影值比使用字符串的列名查詢數(shù)據(jù)效率更高,
關(guān)于代碼優(yōu)化 1)在解析基本數(shù)據(jù)類型是,使用TryParse方法比Try好 2)使用AppendAllText,WriteAllBytes、WriteAllLine,WriteAllText,ReadAllBytes、ReadAllLine、ReadAllText方法讀寫文件內(nèi)容可以優(yōu)化性能, 3)不要使用如下方法 string[]arr=new string{"fly","flying"} for(int i=0;i<arr.Length;i++) { //TODO } 這種方法每循環(huán)一次就計算一次arr.Length的值。而使用 string[]arr=new string{"fly","flying"} int length=arr.Length; for(int i=0;length;i++) { //TODO } 4)避免在循環(huán)里創(chuàng)建對象 for(int i=0;i<10;i++) { SqlConnection cn=new SqlConnection(); //ToDo } 而使用 SqlConnection cn=new SqlConnection(); for(int i=0;i<10;i++) { //ToDo } 5) 盡量減少裝箱的次數(shù),如果要在多處進(jìn)行類型轉(zhuǎn)換,請先定義一個變量 如: int i=129; object box; box=(objiect)i; //下面多次使用Box; 6)不要使用例外控制程序流程, void UserExists(string UserID) { if(dr.Read()) { throw(new Exception("用戶名不存在"); } } 修改代碼如下: bool UserExists(string UserID) { return dr.HasRows; } 7)在循環(huán)中不要使用不變的對象或者字段,例如: for(int i=0;i<Customer.Order.Count;i++) { PrintCustomerData(Customer.State,Customer.Zip,Customer.Order[i]); } 這樣的話沒錯循環(huán)都要查找對象的屬性值 或者字段。 string state=Customer.State; string []zip=Customer.Zip; int count=Customers.Order.Count; for(int i=0;i<count;i++) { PrintCustomerData(state,zip,Customer.Order[i]); } 8)使用for循環(huán)代替foreach循環(huán) 9)數(shù)組是所有集合中最快的,如果沒有特殊的需要,盡量使用數(shù)組代替集合 10)了解各個集合的特性,選擇合適的類型, 11)使用泛型,避免減少使用裝箱,拆箱。
/
頁面處理 1)盡量減少頁面文件的大小 將CSS和腳本存為單獨的文件,不要將多個任務(wù)放在同一個頁面中,不要指定服務(wù)器控件的ID數(shù)據(jù)位比較長的字符串 2)通過Page.IsPostBack減少代碼的執(zhí)行數(shù)量。 3)禁用Debug="true" 減少頁面生成額外的調(diào)試信息, 4)使用Server.Transfer而不使用Response.Redirect 5)盡量使用客戶端驗證,減少使用服務(wù)器端的驗證,減少服務(wù)器和客戶端之間的往返。 6)在適當(dāng)?shù)臅r候使用客戶端服務(wù)器控件 如果不需要在回發(fā)時保持狀態(tài),如果顯示的數(shù)據(jù)是靜態(tài)數(shù)據(jù),如果不需要自愛服務(wù)器端用代碼訪問控件,如果不需要回發(fā)處理,如果顯示的是只讀數(shù)據(jù),就可以考慮不使用 服務(wù)器控件。 7)盡量避免嵌套服務(wù)器控件。
/ 避免使用Page.DataBind和DataBinder.Eval Page.DataBind執(zhí)行時會將頁面中所有的服務(wù)器控件執(zhí)行一次DataBind方法,如果沒有必要就不要使用。 DataBinder.Eval方法是使用反射來獲取參數(shù)的。盡量少使用, 盡量不要使用: <ItemTemplate> <tr> <td><%#DataBinder.Eval(Container.DataItem,"字段一"))%></td> <td><%#DataBinder.Eval(Container.DataItem,"字段一"))%></td> </tr> </ItemTemplate> 而使用: <ItemTemplate> <tr> <td><%#(DataRowView)Container.DataItem["字段1"]%></td> <td><%#(DataRowView)Container.DataItem["字段1"]%></td> </tr> </ItemTemplate>
/ 關(guān)于Application和Session對象 1)盡量使用InProc模式的Session這個模式最快 2)在Session里存儲基本類型的書減少序列化所消耗的資源 3)如果不用Session,請使用EnableViewState=“false”禁用它 4)如果不修改Session變量,請用ReadOnly屬性設(shè)置
/ 關(guān)于字符串操作 1)盡量使用Response.Writ將結(jié)果輸出,這種方法是最快的。不要將字符串連接在一起一次輸出 2)在字符串短并且少的情況使用String.Concat方法,在字符串長度未知,并且比較長的情況下使用SringBuilder對象 3)不要使用StrVar==""來判斷字符串是否為空,這樣會產(chǎn)生額外的字符串,請使用StrVar==String.Empty代替,或者使用StrVar.Length==0來判斷 4)請使用String.Compare方法來比較字符串 關(guān)于數(shù)據(jù)訪問 1)盡量使用存儲過程返回數(shù)據(jù) 2)在數(shù)據(jù)庫中只返回有用的數(shù)據(jù)結(jié)果,不要選擇不使用的數(shù)據(jù)字段。 3)進(jìn)行使用DataReader進(jìn)行數(shù)據(jù)綁定,DataReader是單向只讀的。 4)盡量一次返回多個記錄集,而不是每個記錄集分別打開一次數(shù)據(jù)庫連接進(jìn)行查詢。 5)盡量晚的打開數(shù)據(jù)庫連接,盡量早地關(guān)閉數(shù)據(jù)庫連接,(盡量使用using語句關(guān)閉數(shù)據(jù)庫連接,) 6)使用連接池提高網(wǎng)站性能,不要變動數(shù)據(jù)庫連接字符串,不要將連接進(jìn)行緩存或者放置在Application對象中,當(dāng)使用連接池時,關(guān)閉連接并不是物理連接, 而是將連接返回給連接池供別的用戶使用,因此應(yīng)該盡量早的關(guān)閉連接, 7)使用ExecuteNonQuery返方法執(zhí)行不返回數(shù)據(jù)的操作,使用ExectueScalar方法返回單個結(jié)果的操作, 使用CommandBehavior.SequentialAccess返回二進(jìn)制數(shù)據(jù)或者大數(shù)據(jù)。 8)如果多次相同查詢,使用Command.Prepare方法。 9)使用GetOrdinal方法預(yù)先得到索引值,使用縮影值比使用字符串的列名查詢數(shù)據(jù)效率更高,
關(guān)于代碼優(yōu)化 1)在解析基本數(shù)據(jù)類型是,使用TryParse方法比Try好 2)使用AppendAllText,WriteAllBytes、WriteAllLine,WriteAllText,ReadAllBytes、ReadAllLine、ReadAllText方法讀寫文件內(nèi)容可以優(yōu)化性能, 3)不要使用如下方法 string[]arr=new string{"fly","flying"} for(int i=0;i<arr.Length;i++) { //TODO } 這種方法每循環(huán)一次就計算一次arr.Length的值。而使用 string[]arr=new string{"fly","flying"} int length=arr.Length; for(int i=0;length;i++) { //TODO } 4)避免在循環(huán)里創(chuàng)建對象 for(int i=0;i<10;i++) { SqlConnection cn=new SqlConnection(); //ToDo } 而使用 SqlConnection cn=new SqlConnection(); for(int i=0;i<10;i++) { //ToDo } 5) 盡量減少裝箱的次數(shù),如果要在多處進(jìn)行類型轉(zhuǎn)換,請先定義一個變量 如: int i=129; object box; box=(objiect)i; //下面多次使用Box; 6)不要使用例外控制程序流程, void UserExists(string UserID) { if(dr.Read()) { throw(new Exception("用戶名不存在"); } } 修改代碼如下: bool UserExists(string UserID) { return dr.HasRows; } 7)在循環(huán)中不要使用不變的對象或者字段,例如: for(int i=0;i<Customer.Order.Count;i++) { PrintCustomerData(Customer.State,Customer.Zip,Customer.Order[i]); } 這樣的話沒錯循環(huán)都要查找對象的屬性值 或者字段。 string state=Customer.State; string []zip=Customer.Zip; int count=Customers.Order.Count; for(int i=0;i<count;i++) { PrintCustomerData(state,zip,Customer.Order[i]); } 8)使用for循環(huán)代替foreach循環(huán) 9)數(shù)組是所有集合中最快的,如果沒有特殊的需要,盡量使用數(shù)組代替集合 10)了解各個集合的特性,選擇合適的類型, 11)使用泛型,避免減少使用裝箱,拆箱。
/
轉(zhuǎn)載于:https://www.cnblogs.com/tonybinlj/archive/2009/06/22/1508112.html
總結(jié)
- 上一篇: JS动态添加多个事件
- 下一篇: xp下msn8.5无法安装的解决办法