国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET幾種進行性能優化的方法及注意問題

2024-07-10 13:12:04
字體:
來源:轉載
供稿:網友
  網站的性能對于asp.net程序開發人員來說非常重要。一個優秀的網站雖然有美觀的頁面設計,完善的服務功能,但是打開網頁時有長時間的延遲,用戶最終將會無法忍受。尤其對于大型的電子商務網站而言,每秒鐘有數萬用戶同時訪問,沒有良好的網站性能,根本無法滿足龐大的需求。

  asp.net作為全新一代的動態網頁生成系統,它在平臺性能方面與原有的asp相比已有了一個本質的提高。但要在此基礎上開發出專業水準的、符合生產標準的、受用戶歡迎的web應用程序,還需要開發人員從編程的角度在頁面、數據訪問和字符串處理等各方面進行優化處理,以提高網站的總體性能。

  本文將主要探討在asp.net中與此相關的幾種進行性能優化的方法及注意問題。

  頁面性能優化

  1、會話狀態的恰當選擇

  http協議是一種無狀態的通信協議,無法記錄和識別來自不同客戶端的請求,但在實際應用中系統卻要維護來自客戶端的不同請求之間的會話狀態信息。asp.net通過將會話狀態信息存儲在進程、狀態服務器或sql server數據庫中來解決這個問題。

  將會話狀態信息保存在web服務器的內存中具有最佳的性能,速度很快,但是卻缺乏會話狀態信息跨越多個服務器的能力。若要在多個web服務器之間維護會話信息,可以使用狀態服務器進行存儲,這種方式由于可以將應用程序部署到多臺服務器上而提高了系統的伸縮性和可靠性,但是以降低性能為代價。對于極其重要的會話信息,需要使用sql server存儲方式,從而避免丟失重要的會話信息,但由此產生的工作負載比前兩者大得多。

  若不考慮狀態信息的保留和多個服務器共享,應盡量選擇保存在服務器的進程中,從而得到最佳的性能。

  會話狀態信息的存儲方式選擇通過web.config文件:

  <sessionstate
  mode="inproc/stateserver/sqlserver" //存儲方式由此行選擇
  stateconnectionstring="tcpip=127.0.0.1:42424"
  ……
  timeout="20"/>

  2、服務器控件的優化選擇

  2.1 減少不必要的服務器控件

  服務器控件帶來的方便和功能是html控件所不能比擬的。但是每一個服務器控件都需要在服務器端創建相應的對象,是以犧牲服務器端的資源為代價的,過多的使用服務器控件會極大的影響程序性能。

  很多情況下,簡單地使用html標記或數據綁定即能夠實現所需功能。比如<asp:label>控件,若使用它來顯示靜態信息,則完全可用簡單的標記來實現。如果html控件達不到所要實現的功能,而且在腳本語言如javascript、vbscript也不能實現的情況下,才考慮選擇服務器控件。

  2.2 禁用不必要的狀態視圖

  服務器控件的狀態視圖屬性能夠自動的在頁面往返過程中維護服務器控件的狀態,減少開發者的工作量,但是需要占用大量的服務器內存資源。因此,在不需要服務器控件狀態視圖的情況下,應將其enableviewstate屬性設置為false,如常用的<asp:lable>和<asp:button>控件。

  2.3 page.ispostback的運用

  page.ispostback用于記錄頁面是否從客戶端返回,若為false表示初次運行,否則表示從客戶端再次返回該頁面。page.ispostback的合理應用可以避免頁面在往返過程中的一些不必要的操作。在page_load函數及一些只需要初始化一次的事件函數中均可以使用該屬性來提高應用程序性能。

  void page_load(object o, eventargs e)
  {
  if(! page.ispostback)
  {
  conn=new sqlconnection("server=localhost;uid=sa;pwd=;database=data");
  string sql="select * from student";
  cmd.fill(ds,"stu");
  mydatagrid.databind();
  }
  }

  以上代碼將保證只有在首次訪問該頁面時對數據庫進行讀取并綁定。

  2.4 合理使用datagrid控件

  datagrid控件帶有最強大的數據顯示功能,還內置了對數據的修改、刪除、添加、分頁等很多功能。如果只需簡單的顯示數據, datagrid并非最佳選擇。datagrid控件的分頁功能,數據的存儲方式(存儲在viewstate中)等,雖然讓程序開發者使用方便快捷,但由此產生的性能開銷不容小視。

  datalist控件比datagrid功能少了很多。但自定義性強了很多。特有的多行數據顯示還是比較方便的。datagrid能實現的功能,它基本能實現。

  repeater控件功能最少,但自定義性非常強。由于減少了很多功能,對服務器的性能帶來消耗最小。

  因此,在只需簡單顯示數據列表時,選擇repeater或datalist控件同樣可以達到目的,而且減輕了性能上的開銷。

  數據庫訪問性能優化

  1、數據庫的連接和關閉

  訪問數據庫資源需要創建連接、打開連接和關閉連接幾個操作。這些過程需要多次與數據庫交換信息以通過身份驗證,比較耗費服務器資源。asp.net中提供了連接池(connection pool)改善打開和關閉數據庫對性能的影響。系統將用戶的數據庫連接放在連接池中,需要時取出,關閉時收回連接,等待下一次的連接請求。

  連接池的大小是有限的,如果在連接池達到最大限度后仍要求創建連接,必然大大影響性能。因此,在建立數據庫連接后只有在真正需要操作時才打開連接,使用完畢后馬上關閉,從而盡量減少數據庫連接打開的時間,避免出現超出連接限制的情況。

  2、使用存儲過程

  存儲過程是存儲在服務器上的一組預編譯的sql語句,類似于dos系統中的批處理文件。存儲過程具有對數據庫立即訪問的功能,信息處理極為迅速。使用存儲過程可以避免對命令的多次編譯,在執行一次后其執行規劃就駐留在高速緩存中,以后需要時只需直接調用緩存中的二進制代碼即可。

  另外,存儲過程在服務器端運行,獨立于asp.net程序,便于修改,最重要的是它可以減少數據庫操作語句在網絡中的傳輸。

  3、優化查詢語句

  asp.net中ado連接消耗的資源相當大,sql語句運行的時間越長,占用系統資源的時間也越長。因此,盡量使用優化過的sql語句以減少執行時間。比如,不在查詢語句中包含子查詢語句,充分利用索引等。

  字符串操作性能優化

  1、使用值類型的tostring方法

  在連接字符串時,經常使用"+"號直接將數字添加到字符串中。這種方法雖然簡單,也可以得到正確結果,但是由于涉及到不同的數據類型,數字需要通過裝箱操作轉化為引用類型才可以添加到字符串中。但是裝箱操作對性能影響較大,因為在進行這類處理時,將在托管堆中分配一個新的對象,原有的值復制到新創建的對象中。

  使用值類型的tostring方法可以避免裝箱操作,從而提高應用程序性能。

  2、運用stringbuilder類

  string類對象是不可改變的,對于string對象的重新賦值在本質上是重新創建了一個string對象并將新值賦予該對象,其方法tostring對性能的提高并非很顯著。

  在處理字符串時,最好使用stringbuilder類,其.net 命名空間是system.text。該類并非創建新的對象,而是通過append,remove,insert等方法直接對字符串進行操作,通過tostring方法返回操作結果。

  其定義及操作語句如下所示:

  int num;
  system.text.stringbuilder str=new system.text.stringbuilder(); //創建字符串
  str.append(num.tostring()); //添加數值num
  response.write(str.tostring); //顯示操作結果

  asp.net應用程序性能測試

  在對asp.net應用程序進行性能測試之前,應確保應用程序沒有錯誤,而且功能正確。具體的性能測試可以采用以下工具進行:
  web application strees tool (was)是microsoft發布的一個免費測試工具,可以從http://webtool.rte.microsoft.com/上下載。它可以模擬成百上千個用戶同時對web應用程序進行訪問請求,在服務器上形成流量負載,從而達到測試的目的,可以生成平均ttfb、平均ttlb等性能匯總報告。

  application center test (act) 是一個測試工具,附帶于visual studio.net的企業版中,是microsoft正式支持的web應用程序測試工具。它能夠直觀地生成圖表結果,功能比was多,但不具備多個客戶機同時測試的能力。

  服務器操作系統"管理工具"中的"性能"計數器,可以對服務器進行監測以了解應用程序性能。

  結論

  對于網站開發人員來說,在編寫asp.net應用程序時注意性能問題,養成良好的習慣,提高應用程序性能,至少可以推遲必需的硬件升級,降低網站的成本。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 依安县| 翼城县| 开阳县| 保靖县| 双流县| 城口县| 宁远县| 都江堰市| 陆河县| 玛沁县| 丽水市| 自贡市| 龙游县| 凤凰县| 大名县| 广西| 资溪县| 林州市| 桂阳县| 当阳市| 社旗县| 柯坪县| 乐昌市| 常山县| 康乐县| 商河县| 紫金县| 高雄县| 永州市| 福州市| 卫辉市| 屏南县| 醴陵市| 中牟县| 达拉特旗| 莱芜市| 海城市| 大余县| 商水县| 安乡县| 元朗区|