2019/3/25 9:28:55
現在寫一個(gè)asp.net的(de)web應用(yòng)程序變得非常的(de)簡單,許多的(de)程序員都(dōu)不願花時間去構建一個(gè)性能(néng)良好的(de)應用(yòng)程序。本文(wén)将要討(tǎo)論提高(gāo)web應用(yòng)程序性能(néng)的(de)十大(dà)方法。我将不限于隻討(tǎo)論asp.net應用(yòng)程序的(de)内容,因爲它們隻是web應用(yòng)程序的(de)一個(gè)子集。本文(wén)也(yě)不能(néng)提供一個(gè)完整提高(gāo)web應用(yòng)程序性能(néng)的(de)指南,因爲這需要一本書(shū)的(de)篇幅。本文(wén)隻提供一個(gè)提高(gāo)web應用(yòng)程序性能(néng)的(de)良好的(de)開(kāi)端。(剩下的(de)隻有(yǒu)我們自己慢(màn)慢(màn)研究了)。
在工(gōng)作這外,我經常去攀岩,在每次攀岩之前,我都(dōu)會(huì)重溫一下攀岩線路(lù)圖及看一下前面的(de)成功的(de)攀岩者的(de)建議。因爲我們需要它們的(de)成功經驗。同樣的(de),當你(nǐ)需要修改某個(gè)有(yǒu)性能(néng)問題的(de)程序或者是要開(kāi)發一個(gè)高(gāo)性能(néng)的(de)站點時,你(nǐ)也(yě)需要學習(xí)怎麽樣寫一個(gè)高(gāo)性能(néng)的(de)web應用(yòng)程序。
我個(gè)人(rén)的(de)經驗主要來源于在微軟的(de)asp.net組擔任程序經理(lǐ),運行(xíng)和(hé)管理(lǐ)www.asp.net網站,和(hé)協助開(kāi)發Community Server(它是asp.net Forums,.Text, and nGallery的(de)集成升級版本軟件(jiàn))。我想這些經驗能(néng)我讓來幫助大(dà)家。
你(nǐ)也(yě)許會(huì)想到(dào)把你(nǐ)的(de)應用(yòng)程序劃分(fēn)成不同的(de)邏輯層。你(nǐ)也(yě)可(kě)能(néng)聽過三層物(wù)理(lǐ)架構或N層架構,這是最常用(yòng)的(de)架構模式,它把不同的(de)程序功能(néng)物(wù)理(lǐ)的(de)分(fēn)配給各個(gè)硬件(jiàn)來執行(xíng)。這樣,如(rú)果我們想提高(gāo)應用(yòng)程序的(de)性能(néng)的(de)話(huà),加一些硬件(jiàn)就可(kě)以達到(dào)目的(de)了。按理(lǐ)說這種方法能(néng)提高(gāo)應用(yòng)程序的(de)性能(néng),但(dàn)是我們應該避免使用(yòng)這種方法。所以,隻要有(yǒu)可(kě)能(néng),我們都(dōu)應該把asp.net頁面和(hé)它用(yòng)到(dào)的(de)組件(jiàn)放(fàng)到(dào)一個(gè)應用(yòng)程序中運行(xíng)。
因爲分(fēn)布式的(de)布署,要用(yòng)到(dào)web services或者Remoting,它将使應用(yòng)程序的(de)性能(néng)下降20%或者更多。
對于數據層有(yǒu)點不同,最好還是把它獨立出來布署,用(yòng)一個(gè)單獨的(de)硬件(jiàn)來運行(xíng)它。雖然這樣,但(dàn)是數據庫仍然是應用(yòng)程序性能(néng)的(de)瓶頸。因此,當你(nǐ)想優化你(nǐ)的(de)程序的(de)時候,首先想到(dào)的(de)地(dì)方就應該是優化數據層了。
在修改應用(yòng)程序的(de)出現性能(néng)問題的(de)地(dì)方之前,你(nǐ)要先确認出問題的(de)地(dì)方的(de)程序看起來很嚴密,性能(néng)分(fēn)析器(qì)對于查找應用(yòng)程序哪些地(dì)方花費了多長時間非常有(yǒu)用(yòng)。這些地(dì)方是我們用(yòng)直覺感覺不到(dào)的(de)。
本文(wén)討(tǎo)論兩種類型的(de)性能(néng)優化:一種是大(dà)的(de)性能(néng)優化(big optimizations),如(rú)用(yòng)asp.net的(de)Cache;另一種是小(xiǎo)的(de)性能(néng)優化(tiny optimizations)。小(xiǎo)幅的(de)性能(néng)優化有(yǒu)時候非常有(yǒu)用(yòng)。你(nǐ)隻對你(nǐ)的(de)代碼作一個(gè)小(xiǎo)的(de)改到(dào),然後一次調用(yòng)它一千或一萬次。作一次大(dà)的(de)性能(néng)優化,你(nǐ)會(huì)發生你(nǐ)的(de)應用(yòng)程序的(de)速度會(huì)有(yǒu)一個(gè)很大(dà)的(de)提升。作一次小(xiǎo)的(de)性能(néng)優化,也(yě)許每次請求隻能(néng)提高(gāo)一微秒,但(dàn)是如(rú)果每天的(de)請求量很大(dà)的(de)話(huà),那麽應用(yòng)程序就有(yǒu)很顯著的(de)性能(néng)提升。
數據層的(de)性能(néng)
當你(nǐ)要優化一個(gè)應用(yòng)程序的(de)性能(néng)的(de)時候,你(nǐ)可(kě)以按下面的(de)順序工(gōng)作:你(nǐ)的(de)代碼要訪問數據庫?如(rú)果要,訪問數據庫頻率怎麽樣?同樣,這種測試方法也(yě)可(kě)以用(yòng)在用(yòng)web services或Remoting的(de)程序代碼中。本文(wén)将不討(tǎo)論用(yòng)Web services和(hé)Remoting的(de)程序優化的(de)問題。
如(rú)果在你(nǐ)的(de)代碼中有(yǒu)一段必須訪問數據庫的(de)請求,而你(nǐ)在其它的(de)地(dì)方又(yòu)看到(dào)實現同樣的(de)功能(néng) 的(de)代碼,那麽你(nǐ)首先要優化它。修改和(hé)完善繼續測試,除非你(nǐ)有(yǒu)一個(gè)非常大(dà)的(de)性能(néng)問題,你(nǐ)的(de)時間最好花在優化查詢,連接數據庫,返回數據集的(de)大(dà)小(xiǎo),以及一次查詢往返回的(de)時間上(shàng)。
根據經驗的(de)總結,讓我們來看看十個(gè)能(néng)幫助你(nǐ)提升你(nǐ)的(de)應用(yòng)程序性能(néng)的(de)經驗,我将按将它們提升效率的(de)多少(shǎo)從大(dà)到(dào)小(xiǎo)小(xiǎo)依次說明(míng)。
一、返回多個(gè)數據集
檢查你(nǐ)的(de)訪問數據庫的(de)代碼,看是否存在著(zhe)要返回多次的(de)請求。每次往返降低了你(nǐ)的(de)應用(yòng)程序的(de)每秒能(néng)夠響應請求的(de)次數。通過在單個(gè)數據庫請求中返回多個(gè)結果集,可(kě)以減少(shǎo)與數據庫通信的(de)時間,使你(nǐ)的(de)系統具有(yǒu)擴展性,也(yě)可(kě)以減少(shǎo)數據庫服務器(qì)響應請求的(de)工(gōng)作量。
如(rú)果你(nǐ)是用(yòng)動态的(de)SQL語句來返回多個(gè)數據集,那我建議你(nǐ)用(yòng)存儲過程來替代動态的(de)SQL語句。是否把業(yè)務邏輯寫到(dào)存儲過程中,這個(gè)有(yǒu)點争議。但(dàn)是我認爲,把業(yè)務邏輯寫到(dào)存儲過程裏面可(kě)以限制(zhì)返回結果集的(de)大(dà)小(xiǎo),減小(xiǎo)網絡數據的(de)流量,在邏輯層也(yě)不用(yòng)在過濾數據,這是一個(gè)好事情。
用(yòng)SqlCommand對象的(de)ExecuteReader方法返回一個(gè)強類型的(de)業(yè)務對象,再調用(yòng)NextResult方法來移動數據集指針來定位數據集。示例一演示了一個(gè)返回多個(gè)ArrayList強類型對象的(de)例子。隻從數據庫中返回你(nǐ)需要的(de)數據可(kě)以大(dà)大(dà)的(de)減小(xiǎo)你(nǐ)的(de)服務器(qì)所耗用(yòng)的(de)内存。
二、對數據進行(xíng)分(fēn)頁
ASP。NET的(de)DataGrid有(yǒu)一個(gè)非常有(yǒu)用(yòng)的(de)功能(néng):分(fēn)頁。如(rú)果DataGrid允許分(fēn)頁,在某一時刻它隻下載某一頁的(de)數據,另外,它有(yǒu)一個(gè)數據分(fēn)頁的(de)濟覽導航欄,它讓你(nǐ)可(kě)以選擇浏覽某一頁,而且每次隻下載一頁的(de)數據。
但(dàn)是它有(yǒu)一個(gè)小(xiǎo)小(xiǎo)的(de)缺點,就是你(nǐ)必須把所有(yǒu)的(de)數
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967