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