本文通過參考查閱大量的文獻(xiàn),詳盡分析了ASP.NET網(wǎng)站存在性能問題的若干原因,從程序編碼優(yōu)化、數(shù)據(jù)庫操作優(yōu)化、配置優(yōu)化等若干方面開展了深入研究,并進(jìn)行了分析和總結(jié)。
摘要:基于ASP.NET平臺(tái)的網(wǎng)站和應(yīng)用越來越廣泛,用戶對(duì)網(wǎng)站的訪問速度要求也越來越高。分別從程序編碼優(yōu)化、數(shù)據(jù)操作優(yōu)化和配置優(yōu)化等三個(gè)方面入手,介紹在實(shí)際應(yīng)用開發(fā)中網(wǎng)站性能優(yōu)化的若干方法和技巧,主要針對(duì)響應(yīng)時(shí)間、吞吐量和資源利用率等性能指標(biāo)優(yōu)化網(wǎng)站,以提高訪問速度和網(wǎng)站性能。
關(guān)鍵詞:ASP.NET,性能優(yōu)化,編碼優(yōu)化,數(shù)據(jù)庫優(yōu)化,配置優(yōu)化
0引言
對(duì)于高訪問量的網(wǎng)站來說,網(wǎng)站性能非常重要。網(wǎng)站性能優(yōu)化是指在不影響系統(tǒng)運(yùn)行正確性的前提下,使其能夠運(yùn)行得更快,完成指定功能所需的時(shí)間更短。對(duì)網(wǎng)站訪問者來說,用相對(duì)較短的時(shí)間打開網(wǎng)站頁面不僅可以優(yōu)化用戶網(wǎng)絡(luò)使用時(shí)間的分配比例,且網(wǎng)絡(luò)的使用也更加舒心高效;對(duì)于網(wǎng)站經(jīng)營者來說,網(wǎng)站性能優(yōu)化則可以提高系統(tǒng)響應(yīng)速度和用戶滿意度,并有效平衡系統(tǒng)負(fù)載,從而提高點(diǎn)擊率和網(wǎng)站競(jìng)爭(zhēng)力[1]。所以,通過對(duì)網(wǎng)站優(yōu)化來實(shí)現(xiàn)網(wǎng)絡(luò)性能提高成為解決目前網(wǎng)站訪問過程中存在的各類問題的合理途徑[2]。
1影響ASP.NET性能的幾個(gè)方面
1.1視圖狀態(tài)
視圖狀態(tài)利用ViewState屬性作為內(nèi)置結(jié)構(gòu),對(duì)同一個(gè)頁面的多個(gè)請(qǐng)求自動(dòng)保存值,視圖狀態(tài)則存儲(chǔ)在頁上的一個(gè)或多個(gè)隱藏域中。雖然視圖狀態(tài)以哈希格式存儲(chǔ)數(shù)據(jù),但如果直接查看頁輸出源,仍然可以看到隱藏域中的信息,這將會(huì)導(dǎo)致潛在的安全性問題。視圖狀態(tài)是性能的無形殺手,是以犧牲一定的網(wǎng)站性能為代價(jià),使得頁面和控件能夠在回傳之間保持狀態(tài),不必重新進(jìn)行數(shù)據(jù)綁定。所以通常只是在必要時(shí)保存服務(wù)器控件的視圖狀態(tài),這在一定程度上可以提高網(wǎng)站的執(zhí)行性能[3]。
1.2ASP.NET會(huì)話狀態(tài)
會(huì)話狀態(tài)就是在構(gòu)造Web應(yīng)用程序的不同ASP.NET頁面間的導(dǎo)航時(shí),可為用戶存儲(chǔ)和檢索值。對(duì)于在Web領(lǐng)域中運(yùn)行的應(yīng)用程序來說,這是一項(xiàng)重要功能,因其允許該領(lǐng)域中的每個(gè)服務(wù)器共享一個(gè)會(huì)話狀態(tài)公共庫。但是,在默認(rèn)情況下,所有ASP.NET應(yīng)用程序都啟用了會(huì)話狀態(tài),也就是說,在每個(gè)(甚至與會(huì)話狀態(tài)無關(guān)的頁面)請(qǐng)求中都要付出通信代價(jià),這將直接對(duì)整個(gè)網(wǎng)站的吞吐量形成嚴(yán)重的負(fù)面影響。因此,應(yīng)該禁用那些不實(shí)用會(huì)話狀態(tài)的頁中的會(huì)話狀態(tài)。此時(shí),可通過修改配置文件控制會(huì)話狀態(tài),確保ASP.NET只在真正需要時(shí)才訪問會(huì)話狀態(tài)數(shù)據(jù)庫,而消除不必要的會(huì)話狀態(tài)即是構(gòu)建高性能應(yīng)用程序的第一步,可使性能獲得顯著提高[4]。
2優(yōu)化策略和技術(shù)
2.1程序編碼優(yōu)化
程序編碼優(yōu)化中包括集合優(yōu)化和類型轉(zhuǎn)換優(yōu)化。
2.1.1集合操作
.NETFramework提供了相當(dāng)多的集合類,在對(duì)應(yīng)的集合操作時(shí),首先要熟知不同集合的特性,按照操作需求選擇合適的集合。在所有集合中,數(shù)組的性能是最高的,因此,當(dāng)需要存儲(chǔ)的數(shù)據(jù)容量固定不變且數(shù)據(jù)類型一致,尤其是沒有值類型和object類型相互轉(zhuǎn)換的數(shù)據(jù)操作時(shí),數(shù)組的操作效率是極高的[5]。
需要指出的是,在選擇集合類型時(shí)應(yīng)該注意以下兩點(diǎn):
(1)若需要存儲(chǔ)的數(shù)據(jù)類型相同,則可以優(yōu)先考慮數(shù)組類型,因?yàn)閿?shù)組類型可以避免值類型和object類型的相互轉(zhuǎn)換操作,從而提高效率。
。2)在對(duì)即將存儲(chǔ)大量數(shù)據(jù)的集合進(jìn)行操作時(shí),最好情況是賦予其一個(gè)較大的初始值,以免因增加額外擴(kuò)充集合而帶來的系統(tǒng)性能損失[6]。使用相同數(shù)據(jù)測(cè)試數(shù)組、ArrayList以及List集合操作結(jié)果如圖1所示。
2.1.2類型轉(zhuǎn)換優(yōu)化
在系統(tǒng)開發(fā)過程中,類型轉(zhuǎn)化是不可避免的問題。常見的類型轉(zhuǎn)換有兩種,其一是數(shù)值類型和引用類型的相互轉(zhuǎn)換,另一種則是類之間的類型轉(zhuǎn)換。若轉(zhuǎn)換過程中出現(xiàn)了不能轉(zhuǎn)換的情況,系統(tǒng)就會(huì)拋出異常,這就會(huì)給系統(tǒng)性能帶來不良的影響。此外,在程序編碼過程中還要盡量減少值類型和引用類型之間的轉(zhuǎn)換(即裝箱和拆箱)。而無論是裝箱還是拆箱都需要進(jìn)行大量的計(jì)算,這在無形之中,則必然不利于系統(tǒng)優(yōu)化。
2.2數(shù)據(jù)庫操作優(yōu)化
2.2.1合理使用數(shù)據(jù)庫連接對(duì)象
在連接到數(shù)據(jù)庫時(shí)通常需要很多個(gè)步驟來實(shí)現(xiàn),如果應(yīng)用程序使用了幾個(gè)不同的數(shù)據(jù)庫連接,就將意味著,程序在執(zhí)行期間,會(huì)反復(fù)不斷地打開和關(guān)閉數(shù)據(jù)庫。這也將大大降低系統(tǒng)的總體性能。使用數(shù)據(jù)庫連接,需要遵循一個(gè)原則:盡可能遲些打開數(shù)據(jù)庫,盡可能早些關(guān)閉數(shù)據(jù)庫連接。除了遵循數(shù)據(jù)庫的使用原則以外,還可以通過使用數(shù)據(jù)庫連接池來提高數(shù)據(jù)庫操作的性能。特別地,若能將數(shù)據(jù)庫單獨(dú)另存在一臺(tái)機(jī)器上不僅可以減輕原來服務(wù)器的負(fù)擔(dān),數(shù)據(jù)庫的安全也由此能得到更為切實(shí)的保障[7]。
2.2.2數(shù)據(jù)訪問優(yōu)化
在數(shù)據(jù)庫訪問過程中,經(jīng)常使用DataReader對(duì)象也會(huì)提升一定的性能。DataReader對(duì)象不僅提供了一個(gè)有效的數(shù)據(jù)查看模式,其本身還是一種非常節(jié)省資源的數(shù)據(jù)對(duì)象。此外,在數(shù)據(jù)訪問時(shí)使用存儲(chǔ)過程也是個(gè)不錯(cuò)的選擇。存儲(chǔ)過程可在相當(dāng)程度上增強(qiáng)SQL語言的功能性和靈活性。而且存儲(chǔ)過程還可以有效避免對(duì)命令的多次編譯,一次執(zhí)行后就駐留在高速緩存中,以待其后從緩存中直接調(diào)用,這些均將使系統(tǒng)性能獲得高度提升。
2.2.3合理使用緩存
緩存是指臨時(shí)文件交換區(qū),是可以進(jìn)行高速數(shù)據(jù)交換的存儲(chǔ)器。緩存的使用可以大大提高系統(tǒng)的效率。合理設(shè)置緩存,應(yīng)用系統(tǒng)就會(huì)根據(jù)每個(gè)用戶的請(qǐng)求從高速緩存中讀取已有數(shù)據(jù),由此明顯提高應(yīng)用程序的性能。但卻不要頻繁變化緩存,而且盡量避免將使用并不頻繁的數(shù)據(jù)放入緩存,更不要將數(shù)據(jù)緩存的時(shí)間設(shè)置過短。
2.3配置優(yōu)化
2.3.1合理使用ViewState
在ASP.NET中為了實(shí)現(xiàn)服務(wù)器控件在HTTP請(qǐng)求之間維護(hù)其狀態(tài)而啟用了服務(wù)器控件的視圖狀態(tài)。服務(wù)器控件視圖狀態(tài)為其所有屬性的累計(jì)值,這些值在后面的請(qǐng)求處理中將作為變量傳遞給隱藏的字段,一般情況下這些值是經(jīng)過了一定的編碼或者加密處理之后再保存到隱藏字段中的,在后面的請(qǐng)求中是需要反向處理才能得到原始的值,而這些處理都是需要時(shí)間花費(fèi)的。有時(shí)候?yàn)榱颂岣邞?yīng)用程序的性能,在不需維護(hù)服務(wù)器控件的情況下就可以禁用視圖狀態(tài)(默認(rèn)情況下是啟用視圖狀態(tài)的),特別是在使用數(shù)據(jù)綁定控件時(shí),則務(wù)需關(guān)注該問題。
2.3.2合理選擇會(huì)話狀態(tài)存儲(chǔ)方式
3結(jié)束語
通過合理地編程優(yōu)化、數(shù)據(jù)庫操作優(yōu)化和配置優(yōu)化,可以使得ASP.NET應(yīng)用程序的性能得到顯著提升,網(wǎng)站的負(fù)載平衡性能也得到明顯改善,因而大大提高了系統(tǒng)性能。另外,也可從異常處理、垃圾回收機(jī)制、緩存頁數(shù)據(jù)等方面進(jìn)行優(yōu)化,均可進(jìn)一步提高系統(tǒng)的吞吐量。
參考文獻(xiàn):
[1]白哲,孫可.網(wǎng)站的技術(shù)優(yōu)化策略研究[J].沈陽師范大學(xué)(自然科學(xué)版),2010,7(15):395-397.
[2]楊舟.淺析大型網(wǎng)站的性能優(yōu)化[J].軟件工程師,2010,12(15):38-40.
[3]徐征,程宴.淺談網(wǎng)站系統(tǒng)的高效優(yōu)化[J].計(jì)算機(jī)與數(shù)字工程,2008,36(10):206-209.
[4]湯海鳳,張春燕,葛明明.基于緩存技術(shù)的ASP網(wǎng)站性能優(yōu)化策略研究[J].信息技術(shù),2011,8(25):222-224.
[5]趙春燕.網(wǎng)站優(yōu)化深度研究[J].信息安全與技術(shù),2012,6(5):61-64.
[6]桂友武,桂友超.基于ASP.NET企業(yè)網(wǎng)站的性能優(yōu)化探討[J].企業(yè)技術(shù)開發(fā),2009,4(1):122-123.
轉(zhuǎn)載請(qǐng)注明來自:http://www.jinnzone.com/jisuanjiwangluolw/34216.html