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)容都進行緩存就能提高性能的,,由于服務器的資源是有限的,,緩存不適當?shù)臄?shù)據(jù)反而會降低性能,應當緩存的應該是應用程序級的數(shù)據(jù),,多個用戶 共同使用的數(shù)據(jù),,靜態(tài)數(shù)據(jù),生成數(shù)據(jù)需要開銷很大的數(shù)據(jù),,DataSet以及自定義的對象等,,不要緩存數(shù)據(jù)庫連接對象,不要緩存DataReader. 3)選擇適當?shù)姆绞? --------------------
2,、視圖 1)如果不需要用視圖請禁用它,, 視圖狀態(tài)默認是允許的,,如果頁面不進行Postback如果不處理服務器控件事件,可以禁用它 2)盡量減少視圖狀態(tài)中存放的對象 不要在視圖狀態(tài)中存放大量的對象,。 --------------------
頁面處理 1)盡量減少頁面文件的大小 將CSS和腳本存為單獨的文件,,不要將多個任務放在同一個頁面中,不要指定服務器控件的ID數(shù)據(jù)位比較長的字符串 2)通過Page.IsPostBack減少代碼的執(zhí)行數(shù)量,。 3)禁用Debug="true" 減少頁面生成額外的調(diào)試信息,, 4)使用Server.Transfer而不使用Response.Redirect 5)盡量使用客戶端驗證,減少使用服務器端的驗證,,減少服務器和客戶端之間的往返,。 6)在適當?shù)臅r候使用客戶端服務器控件 如果不需要在回發(fā)時保持狀態(tài),如果顯示的數(shù)據(jù)是靜態(tài)數(shù)據(jù),,如果不需要自愛服務器端用代碼訪問控件,,如果不需要回發(fā)處理,如果顯示的是只讀數(shù)據(jù),,就可以考慮不使用 服務器控件,。 7)盡量避免嵌套服務器控件。
-------------------- 避免使用Page.DataBind和DataBinder.Eval Page.DataBind執(zhí)行時會將頁面中所有的服務器控件執(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屬性設置
-------------------- 關(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)進行使用DataReader進行數(shù)據(jù)綁定,,DataReader是單向只讀的。 4)盡量一次返回多個記錄集,,而不是每個記錄集分別打開一次數(shù)據(jù)庫連接進行查詢,。 5)盡量晚的打開數(shù)據(jù)庫連接,盡量早地關(guān)閉數(shù)據(jù)庫連接,,(盡量使用using語句關(guān)閉數(shù)據(jù)庫連接,,) 6)使用連接池提高網(wǎng)站性能,,不要變動數(shù)據(jù)庫連接字符串,不要將連接進行緩存或者放置在Application對象中,,當使用連接池時,,關(guān)閉連接并不是物理連接, 而是將連接返回給連接池供別的用戶使用,,因此應該盡量早的關(guān)閉連接,, 7)使用ExecuteNonQuery返方法執(zhí)行不返回數(shù)據(jù)的操作,使用ExectueScalar方法返回單個結(jié)果的操作,, 使用CommandBehavior.SequentialAccess返回二進制數(shù)據(jù)或者大數(shù)據(jù),。 8)如果多次相同查詢,使用Command.Prepare方法,。 9)使用GetOrdinal方法預先得到索引值,,使用縮影值比使用字符串的列名查詢數(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ù),,如果要在多處進行類型轉(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)使用泛型,,避免減少使用裝箱,,拆箱。
|