熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

優化ASP.NET應用程序性能研究與探討

2013-11-13 10:24:06  來源: .NET編程 

  網站的性能對於ASPNET程序開發人員來說非常重要一個優秀的網站雖然有美觀的頁面設計完善的服務功能但是打開網頁時有長時間的延遲用戶最終將會無法忍受尤其對於大型的電子商務網站而言每秒鐘有數萬用戶同時訪問沒有良好的網站性能根本無法滿足龐大的需求
  
  ASPNET作為全新一代的動態網頁生成系統它在平台性能方面與原有的ASP相比已有了一個本質的提高但要在此基礎上開發出專業水准的符合生產標准的受用戶歡迎的web應用程序還需要開發人員從編程的角度在頁面數據訪問和字符串處理等各方面進行優化處理以提高網站的總體性能
  
  本文將主要探討在ASPNET中與此相關的幾種進行性能優化的方法及注意問題
  
  頁面性能優化
  會話狀態的恰當選擇
  
  HTTP協議是一種無狀態的通信協議無法記錄和識別來自不同客戶端的請求但在實際應用中系統卻要維護來自客戶端的不同請求之間的會話狀態信息ASPNET通過將會話狀態信息存儲在進程狀態服務器或SQL Server數據庫中來解決這個問題
  
  將會話狀態信息保存在WEB服務器的內存中具有最佳的性能速度很快但是卻缺乏會話狀態信息跨越多個服務器的能力若要在多個WEB服務器之間維護會話信息可以使用狀態服務器進行存儲這種方式由於可以將應用程序部署到多台服務器上而提高了系統的伸縮性和可靠性但是以降低性能為代價對於極其重要的會話信息需要使用SQL Server存儲方式從而避免丟失重要的會話信息但由此產生的工作負載比前兩者大得多
  
  若不考慮狀態信息的保留和多個服務器共享應盡量選擇保存在服務器的進程中從而得到最佳的性能
  
  會話狀態信息的存儲方式選擇通過nfig文件
  
  <sessionState
  mode=InProc/StateServer/SqlServer //存儲方式由此行選擇
  stateConnectionString=tcpip=:
  ……
  timeout=/>
  
  服務器控件的優化選擇
  
   減少不必要的服務器控件
  
  服務器控件帶來的方便和功能是html控件所不能比擬的但是每一個服務器控件都需要在服務器端創建相應的對象是以犧牲服務器端的資源為代價的過多的使用服務器控件會極大的影響程序性能
  
  很多情況下簡單地使用html標記或數據綁定即能夠實現所需功能比如<asp:Label>控件若使用它來顯示靜態信息則完全可用簡單的標記來實現如果html控件達不到所要實現的功能而且在腳本語言如javascriptvbscript也不能實現的情況下才考慮選擇服務器控件
  
   禁用不必要的狀態視圖
  
  服務器控件的狀態視圖屬性能夠自動的在頁面往返過程中維護服務器控件的狀態減少開發者的工作量但是需要占用大量的服務器內存資源因此在不需要服務器控件狀態視圖的情況下應將其EnableViewState屬性設置為false如常用的<asp:Lable>和<asp:Button>控件
  
   PageIsPostBack的運用
  
  PageIsPostBack用於記錄頁面是否從客戶端返回若為false表示初次運行否則表示從客戶端再次返回該頁面PageIsPostBack的合理應用可以避免頁面在往返過程中的一些不必要的操作在Page_Load函數及一些只需要初始化一次的事件函數中均可以使用該屬性來提高應用程序性能
  
  void Page_Load(Object o EventArgs e)
  {
  if(! PageIsPostBack)
  {
  conn=new SqlConnection(server=localhost;uid=sa;pwd=;database=data);
  String sql=select * from student;
  cmdFill(dsstu);
  mydataGridDataBind();
  }
  }
  
  以上代碼將保證只有在首次訪問該頁面時對數據庫進行讀取並綁定
  
   合理使用DataGrid控件
  
  DataGrid控件帶有最強大的數據顯示功能還內置了對數據的修改刪除添加分頁等很多功能如果只需簡單的顯示數據 DataGrid並非最佳選擇DataGrid控件的分頁功能數據的存儲方式(存儲在viewstate中)等雖然讓程序開發者使用方便快捷但由此產生的性能開銷不容小視
  
  DataList控件比DataGrid功能少了很多但自定義性強了很多特有的多行數據顯示還是比較方便的DataGrid能實現的功能它基本能實現
  
  Repeater控件功能最少但自定義性非常強由於減少了很多功能對服務器的性能帶來消耗最小
  
  因此在只需簡單顯示數據列表時選擇Repeater或DataList控件同樣可以達到目的而且減輕了性能上的開銷
  
  數據庫訪問性能優化
  數據庫的連接和關閉
  
  訪問數據庫資源需要創建連接打開連接和關閉連接幾個操作這些過程需要多次與數據庫交換信息以通過身份驗證比較耗費服務器資源ASPNET中提供了連接池(Connection Pool)改善打開和關閉數據庫對性能的影響系統將用戶的數據庫連接放在連接池中需要時取出關閉時收回連接等待下一次的連接請求
  
  連接池的大小是有限的如果在連接池達到最大限度後仍要求創建連接必然大大影響性能因此在建立數據庫連接後只有在真正需要操作時才打開連接使用完畢後馬上關閉從而盡量減少數據庫連接打開的時間避免出現超出連接限制的情況
  
  使用存儲過程
  
  存儲過程是存儲在服務器上的一組預編譯的SQL語句類似於DOS系統中的批處理文件存儲過程具有對數據庫立即訪問的功能信息處理極為迅速使用存儲過程可以避免對命令的多次編譯在執行一次後其執行規劃就駐留在高速緩存中以後需要時只需直接調用緩存中的二進制代碼即可
  
  另外存儲過程在服務器端運行獨立於ASPNET程序便於修改最重要的是它可以減少數據庫操作語句在網絡中的傳輸
  
  優化查詢語句
  
  ASPNET中ADO連接消耗的資源相當大SQL語句運行的時間越長占用系統資源的時間也越長因此盡量使用優化過的SQL語句以減少執行時間比如不在查詢語句中包含子查詢語句充分利用索引等
  
  字符串操作性能優化
  使用值類型的ToString方法
  
  在連接字符串時經常使用+號直接將數字添加到字符串中這種方法雖然簡單也可以得到正確結果但是由於涉及到不同的數據類型數字需要通過裝箱操作轉化為引用類型才可以添加到字符串中但是裝箱操作對性能影響較大因為在進行這類處理時將在托管堆中分配一個新的對象原有的值復制到新創建的對象中
  
  使用值類型的ToString方法可以避免裝箱操作從而提高應用程序性能
  
  運用StringBuilder類
  
  String類對象是不可改變的對於String對象的重新賦值在本質上是重新創建了一個String對象並將新值賦予該對象其方法ToString對性能的提高並非很顯著
  
  在處理字符串時最好使用StringBuilder類NET 命名空間是SystemText該類並非創建新的對象而是通過AppendRemoveInsert等方法直接對字符串進行操作通過ToString方法返回操作結果
  
  其定義及操作語句如下所示
  
  int num;
  SystemTextStringBuilder str=new SystemTextStringBuilder(); //創建字符串
  strAppend(numToString()); //添加數值num
  ResponseWrite(strToString); //顯示操作結果
  
  ASPNET應用程序性能測試
  
  在對ASPNET應用程序進行性能測試之前應確保應用程序沒有錯誤而且功能正確具體的性能測試可以采用以下工具進行
  Web Application Strees Tool (WAS)是Microsoft發布的一個免費測試工具可以從上下載它可以模擬成百上千個用戶同時對web應用程序進行訪問請求在服務器上形成流量負載從而達到測試的目的可以生成平均TTFB平均TTLB等性能匯總報告
  
  Application Center Test (ACT) 是一個測試工具附帶於Visual StudioNET的企業版中是Microsoft正式支持的web應用程序測試工具它能夠直觀地生成圖表結果功能比WAS多但不具備多個客戶機同時測試的能力
  
  服務器操作系統管理工具中的性能計數器可以對服務器進行監測以了解應用程序性能
  
  結論
  對於網站開發人員來說在編寫ASPNET應用程序時注意性能問題養成良好的習慣提高應用程序性能至少可以推遲必需的硬件升級降低網站的成本
From:http://tw.wingwit.com/Article/program/net/201311/13499.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.