一、減少往返行程(Reduce Round Trips)
使用下面的方法可以減少Web服務器和Browser之間的往返行程:
1、為Browser啟用緩存
如果呈現的內容是靜態的或變化周期較長,應啟用Browser緩存,避免發出冗余的http請求。
2、緩沖頁面輸出
如果可能,則盡量緩沖頁面輸出,處理結束後再一次傳送到客戶端,這可以避免頻繁傳遞小塊內容所造成的多次網絡交互。由於這種方式在頁面處理結束之前客戶端無法看到頁面內容,因此如果一個頁面的尺寸較大的話,可考慮使用Response.Flush方法。該方法強制輸出迄今為止在緩沖區中的內容,你應當采用合理的算法控制調用Response.Flush方法的次數。
3、使用Server.Transfer重定向請求
使用Server.Transfer方法重定向請求優於Response.Redirect方法。原因是Response.Redirect會向Broswer回送一個響應頭,在響應頭中指出重定向的URL,之後Brower使用新的URL重新發出請求。而Server.Transfer方法直接是一個簡單的服務端調用,完全沒有這些開銷!
需要注意Server.Transfer有局限性:第一,它會跳過安全檢查;第二,只適用於在同一Web應用內的頁面間跳轉。
二、避免阻塞和長時間的作業
如果需要運行阻塞或長時間運行的操作,可以考慮使用異步調用的機制,以便Web服務器能夠繼續處理其它的請求。
1、使用異步方式調用Web服務和遠程對象
只要有可能就要避免在請求的處理過程中對Web服務和遠程對象的同步調用,因為它占用的是的ASP.Net 線程池中的工作線程,這將直接影響Web服務器響應其它請求的能力。
2、考慮給不需要返回值的Web方法或遠程對象的方法添加OneWay屬性
這種模式能讓Web Server調用之後就立即返回。可根據實際情況決定是否使用這種方法。
3、使用工作隊列
將作業提交到服務器上的工作隊列中。客戶端通過發送請求來輪詢作業的執行結果。
三、使用緩存
緩存能在很大程度上決定ASP.NET應用的最終性能。ASP.Net支持頁面輸出緩存和頁面部分緩存,並提供Cache API,供應用程序緩存自己的數據。是否使用緩存可考慮下面的要點:
1、識別創建與訪問代價較大的數據
2、評估需要緩存數據的易變性
3、評估數據的使用頻次
4、 將要緩存數據中易變數據和不變數據分離,只緩存不變數據
5、選擇合適的緩存機制(除ASP.Net Cache外,Application state和Session state也可以作為緩存使用)
四、多線程
1、避免在請求處理過程中創建線程
在執行請求的過程中創建線程是一種代價較大的操作,會嚴重影響Web Server的性能。如果後續的操作必須用線程完成,建議通過thread pool來創建/管理線程。
2、不要依賴線程數據槽或線程靜態變量
由於執行請求的線程是ASP.Net thread pool中的工作線程,同一個ClIEnt的兩次請求不一定由相同的線程來處理。
3、避免阻塞處理請求的線程
4、避免異步調用
這和1的情況類似。異步調用會導致創建新的線程,增加服務器的負擔。所以,如果沒有並發的作業要執行,就不要執行異步調用。
五、系統資源
1、考慮實現資源池以提升性能
2、明確地調用Dispose或Close釋放系統資源
3、不要緩存或長時間占用資源池中的資源
4、盡可能晚的申請,盡可能早的釋放
六、頁面處理
1、盡量減小Page的尺寸
包括縮短控件的名稱、CSS的class的名稱、去掉無謂空行和空格、禁用不需要的VIEwState
2、啟用頁面輸出的緩沖區(Buffer)
如果Buffer的機制被關閉,可以用下面的方法打開。
使用程序打開頁面輸出緩存:
Response.BufferOutput = true;
使用@Page開關打開頁面輸出緩沖機制:
使用Web.config或Machine.config配置文件的 節點:
3、利用Page.IsPostBack優化頁面輸出
4、通過分離頁面的不同的內容,來提高緩存效率和減少呈現的時間
5、優化復雜和代價較大的循環
6、合理利用客戶端的計算資源,將一些操作轉移到客戶端進行
七、VIEwState
VIEwState是ASP.Net為服務端控件在頁面回傳之間跟蹤狀態信息而設計的一種機制。
1. 關閉VIEwState
如果不需要跟蹤頁面狀態,例如頁面不會 回傳(PostBack)、不需要處理服務端控件事件或者每次頁面刷新時都會重新計算控件內容,那麼就不需要用ViewState來記錄頁面狀態了。可以對特定的WebControl設置EnableVIEwState屬性,也可以在頁面一級設置:
2、在恰當的時間點初始化控件屬性
ASP.Net的控件在執行構造函數、初始化的期間設置的屬性不會被跟蹤變化;而在初始化階段之後對屬性的修改都會被跟蹤,並最終記錄到IE頁面的__VIEWSTATE之中。所以,選擇合理的初始化控件屬性的執行點,能有效的減小頁面尺寸。
3、謹慎選擇放到VIEwState中的內容
放到VIEwState中的內容會被序列化/反序列化,ASP.Net為String、Integer、Boolean等基本類型的序列化做了優化,如果Array、ArrayList、HashTable存儲的是基本類型效率也較高,但其它類型則需要提供類型轉換器(Type Converter),否則將使用代價昂貴的二進制序列化程序。
總結:光有了這些技術方法還不夠,還需要將這些方法根據你網站的情況靈活運用,適時調整方法,集中解決重要問題,這有這樣網站性能才能得到大幅度的優化。