提高ASP.Net應用程式效能的十大方法(一)

來源:互聯網
上載者:User
提高ASP.Net應用程式效能的十大方法(一)
作者: chyich   www.ASPCool.com 時間:2005-1-18 13:28:09  閱讀次數:892

     作者: Rob Howard

  出自: http://msdn.microsoft.com/msdnmag/issues/05/01/ASPNETPerformance/default.aspx

  翻譯:chyich

  翻譯時間:2005-1-5

  本文討論:

  ? 提高asp.net應用程式效能的常說的神話

  ? 有用的提高asp.net應用程式效能的技巧

  ? Asp.net應用程式操作資料庫的建議

  ? Asp.net中的緩衝與幕後處理進程

   現在寫一個asp.net的web應用程式變得非常的簡單,許多的程式員都不願花時間去構建一個效能良好的應用程式。本文將要討論提高web應用程式效能的十大方法。我將不限於只討論asp.net應用程式的內容,因為它們只是web應用程式的一個子集。本文也不能提供一個完整提高web應用程式效能的指南,因為這需要一本書的篇幅。本文只提供一個提高web應用程式效能的良好的開端。(剩下的只有我們自己慢慢研究了)。

  在工作這外,我經常去攀岩,在每次攀岩之前,我都會重溫一下攀岩線路圖及看一下前面的成功的攀岩者的建議。因為我們需要它們的成功經驗。同樣的,當你需要修改某個有效能問題的程式或者是要開發一個高效能的網站時,你也需要學習怎麼樣寫一個高效能的web應用程式。

  我個人的經驗主要來源於在微軟的asp.net組擔任程式經理,運行和管理www.asp.net網站,和協助開發Community Server(它是asp.net Forums,.Text, and nGallery的整合升級版本軟體)。我想這些經驗能我讓來協助大家。

  你也許會想到把你的應用程式劃分成不同的邏輯層。你也可能聽過三層物理架構或N層架構,這是最常用的架構模式,它把不同的程式功能物理的分配給各個硬體來執行。這樣,如果我們想提高應用程式的效能的話,加一些硬體就可以達到目的了。按理說這種方法能提高應用程式的效能,但是我們應該避免使用這種方法。所以,只要有可能,我們都應該把asp.net頁面和它用到的組件放到一個應用程式中運行。

  因為分布式的布署,要用到web services或者Remoting,它將使應用程式的效能下降20%或者更多。

   對於資料層有點不同,最好還是把它獨立出來布署,用一個單獨的硬體來運行它。雖然這樣,但是資料庫仍然是應用程式效能的瓶頸。因此,當你想最佳化你的程式的時候,首先想到的地方就應該是最佳化資料層了。

  在修改應用程式的出現效能問題的地方之前,你要先確認出問題的地方的程式看起來很嚴密,效能分析器對於尋找應用程式哪些地方花費了多長時間非常有用。這些地方是我們用直覺感覺不到的。

  本文討論兩種類型的效能最佳化:一種是大的效能最佳化(big optimizations),如用asp.net的Cache;另一種是小的效能最佳化(tiny optimizations)。小幅的效能最佳化有時候非常有用。你只對你的代碼作一個小的改到,然後一次調用它一千或一萬次。作一次大的效能最佳化,你會發生你的應用程式的速度會有一個很大的提升。作一次小的效能最佳化,也許每次請求只能提高一微秒,但是如果每天的請求量很大的話,那麼應用程式就有很顯著的效能提升。

  資料層的效能

   當你要最佳化一個應用程式的效能的時候,你可以按下面的順序工作:你的代碼要訪問資料庫?如果要,訪問資料庫頻率怎麼樣?同樣,這種測試方法也可以用在用web services或Remoting的程式碼中。本文將不討論用Web services和Remoting的程式最佳化的問題。

  如果在你的代碼中有一段必須訪問資料庫的請求,而你在其它的地方又看到實現同樣的功能 的代碼,那麼你首先要最佳化它。修改和完善繼續測試,除非你有一個非常大的效能問題,你的時間最好花在最佳化查詢,串連資料庫,返回資料集的大小,以及一次查詢往返回的時間上。

  根據經驗的總結,讓我們來看看十個能協助你提升你的應用程式效能的經驗,我將按將它們提升效率的多少從大到小小依次說明。

  一、返回多個資料集

   檢查你的訪問資料庫的代碼,看是否存在著要返回多次的請求。每次往返降低了你的應用程式的每秒能夠響應請求的次數。通過在單個資料庫請求中返回多個結果集,可以減少與資料庫通訊的時間,使你的系統具有擴充性,也可以減少資料庫伺服器響應請求的工作量。

  如果你是用動態SQL語句來返回多個資料集,那我建議你用預存程序來替代動態SQL語句。是否把商務邏輯寫到預存程序中,這個有點爭議。但是我認為,把商務邏輯寫到預存程序裡面可以限制返回結果集的大小,減小網路資料的流量,在邏輯層也不用在過濾資料,這是一個好事情。

  用SqlCommand對象的ExecuteReader方法返回一個強型別的業務對象,再調用NextResult方法來移動資料集指標來定位元據集。樣本一示範了一個返回多個ArrayList強型別對象的例子。只從資料庫中返回你需要的資料可以大大的減小你的伺服器所耗用的記憶體。

  二、對資料進行分頁

   ASP。NET的DataGrid有一個非常有用的功能:分頁。如果DataGrid允許分頁,在某一時刻它只下載某一頁的資料,另外,它有一個資料分頁的濟覽導覽列,它讓你可以選擇瀏覽某一頁,而且每次只下載一頁的資料。

  但是它有一個小小的缺點,就是你必須把所有的資料都綁定到DataGrid中。也就是說,你的資料層必須返回所有的資料,然後DataGrid再根據當前頁過濾出當前頁所需要的資料顯示出來。如果有一個一萬條記錄的結果集要用DataGrid進行分頁,假設DataGrid每頁只顯示25條資料,那就意味著每次請求都有9975條資料都是要丟棄的。每次請求都要返回這麼大的資料集,對應用程式的效能影響是非常大的。

  一個好的解決方案是寫一個分頁的預存程序,例子2是一個用於對Northwind資料庫orders表的分頁預存程序。你只需要傳當前頁碼,每頁顯示的條數兩個參數進來,預存程序會返回相應的結果。

  在伺服器端,我專門寫了一個分頁的控制項來處理資料的分頁,在這裡,我用了第一個方法,在一個預存程序裡面返回了兩個結果集:資料記錄總數和要求的結果集。

  返回的記錄總數取決於要執行查詢,例如,一個where條件可以限制返回的結果集的大小。因為在分頁介面中必須要根據資料集記錄的大小來計算總的頁數,所以必須要返回結果集的記錄數。例如,如果一共有1000000條記錄,如果用where條件就可以過濾成只返回1000條記錄,預存程序的分頁邏輯應該知道返回那些需要顯示的資料。

  三、串連池

   用TCP來串連你的應用程式與資料庫是一件昂貴的事情(很費時的事情),微軟的開發人員可以通過用串連池來反覆的使用資料庫的串連。比起每次請求都用TCP來連一次資料庫,串連池只有在不存在有效串連時才建立一個TCP串連。當關閉一個串連的時候,它會被放到池中,它仍然會保持與資料庫的串連,這樣就可以減少與資料庫的TCP串連次數。

  當然,你要注意那些忘記關的串連,你應在每次用完串連後馬上關閉它。我要強調的是:無論什麼人說.net framework中的GC(垃圾收集器)總會在你用完連線物件後調用連線物件的Close或者Dispose方法顯式的關閉你的串連。不要期望CLR會在你想象的時間內關掉串連,雖然CLR最終都要銷毀對象和關閉邊接,但是我們並不能確定它到底會在什麼時候做這些事情。

  要用串連池最佳化,有兩條規則,第一,開啟串連,處理資料,然後關閉串連。如果你必須在每次請求中多次開啟或關閉串連,這好過一直開啟一個邊接,然後把它傳到各個方法中。第二,用相同的連接字串(或者用相同的使用者標識,當你用整合認證的時候)。如果你沒有用相同的連接字串,如你用基於登入使用者的連接字串,這將不能利用串連池的最佳化功能。如果你用的是整合的論證,因為使用者很多,所以你也不能充分利用串連池的最佳化功能。.NET CLR提供了一個資料效能計數器,它在我們需要跟蹤程式效能特性的時候非常有用,當然也包括串連池的跟蹤了。

  無論你的應用程式什麼時候要連在另一台機子的資源,如資料庫,你都應該重點最佳化你連資源所花的時間,接收和發送資料的時間,以及往返回之間的次數。最佳化你的應用程式中的每一個處理點(process hop),它是提高你的應用的效能的出發點。

  應用程式層包含與資料層串連,傳送資料到相應的類的執行個體以及業務處理的邏輯。例如,在Community Server中,要組裝一個Forums或者Threads集合,然後應用商務邏輯,如授權,更重要的,這裡要完成緩衝邏輯。

  

  

  還沒有譯完.下個星期繼續.

  

  本文出處:http://blog.aspcool.com/chyich/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.