何蕾
【摘 要】越來(lái)越多的大中型網(wǎng)站都采用基于.NET的方式開(kāi)發(fā)。從代碼、頁(yè)面、交互策略和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)性能等方面對(duì)基于.NET的大中型網(wǎng)站的性能優(yōu)化進(jìn)行了研究。
【關(guān)鍵詞】.NET;大中型網(wǎng)站;數(shù)據(jù)庫(kù)訪(fǎng)問(wèn);網(wǎng)站性能;優(yōu)化策略
Research on the Optimization of Large and Medium Sized Websites Based on.NET
HE Lei
(Guangzhou College of Commerce, Guangzhou Guangdong 511363, China)
【Abstract】More and more large and middle scale websites are developed based on .NET. This paper studies the performance of large and medium - sized websites based on .NET from the aspects of code, page, interaction strategy and database access.
【Key words】.NET; Large and medium website; Database access; Website performance; Optimization strategy
隨著計(jì)算機(jī)性能、網(wǎng)絡(luò)技術(shù)的不斷提高,以及高性能寬帶的大規(guī)模普及,人們?cè)L問(wèn)網(wǎng)站的速度越來(lái)越快,計(jì)算機(jī)處理網(wǎng)頁(yè)功能的能力也越來(lái)越強(qiáng),以至于使很多人都進(jìn)入了一個(gè)誤區(qū):現(xiàn)在開(kāi)發(fā)網(wǎng)站,主要精力應(yīng)該放在頁(yè)面設(shè)計(jì)和功能的實(shí)現(xiàn)上,而性能的優(yōu)化已經(jīng)無(wú)足輕重。這種想法在開(kāi)發(fā)訪(fǎng)問(wèn)量和數(shù)據(jù)量小的小型網(wǎng)站的時(shí)候可能危害還不明顯,但在開(kāi)發(fā)訪(fǎng)問(wèn)量和數(shù)據(jù)量極大的大中型網(wǎng)站時(shí)就存在著極大的隱患了,很可能造成網(wǎng)站的反應(yīng)速度慢,甚至在并發(fā)量高的時(shí)候造成網(wǎng)站的崩潰。
Microsoft .NET憑著平臺(tái)無(wú)關(guān)性、多開(kāi)發(fā)語(yǔ)言支持、豐富的類(lèi)庫(kù)以及強(qiáng)大的Web Service功能等特性,成為了目前大部分的大中型網(wǎng)站首先的方法。因此,加強(qiáng)對(duì)基于.NET的大中型網(wǎng)站的性能優(yōu)化研究就顯得非常必要和有意義了。
1 Microsoft .NET概述
Microsoft .NET是微軟開(kāi)發(fā)的以Web services為核心的新一代技術(shù)平臺(tái),通過(guò)這個(gè)平臺(tái),各種互聯(lián)網(wǎng)上的應(yīng)用程序可以進(jìn)行互聯(lián),而無(wú)需理會(huì)這些應(yīng)用程序是用什么編程語(yǔ)言開(kāi)發(fā)的、是運(yùn)行在哪種設(shè)備和操作系統(tǒng)上。開(kāi)發(fā)人員可以使用C#、VB、VC++和java等語(yǔ)言來(lái)開(kāi)發(fā)各種基于.NET的應(yīng)用程序,編譯后的應(yīng)用程序可以運(yùn)行在裝有.NET Framework的任意平臺(tái)上,實(shí)現(xiàn)一次編譯、到處運(yùn)行的思想。
2 大中型網(wǎng)站的性能優(yōu)化
大中型網(wǎng)站大都基于Microsoft.NET開(kāi)發(fā)的,而開(kāi)發(fā)的語(yǔ)言則不盡相同。要提高這些網(wǎng)站的性能,可以從代碼、頁(yè)面設(shè)計(jì)、交互策略和數(shù)據(jù)庫(kù)連接等方面去優(yōu)化。
2.1 優(yōu)化代碼,提高代碼執(zhí)行效率
代碼具有很大的靈活性,實(shí)現(xiàn)某一個(gè)功能,可能會(huì)有很多種編碼方式,如果能夠選擇最好的實(shí)現(xiàn)方式,則可以提高代碼的執(zhí)行效率,從而提高網(wǎng)頁(yè)的反應(yīng)速度。
1)使用Foreach代替for語(yǔ)句
在C#中,foreach的平均執(zhí)行時(shí)間只是for語(yǔ)句的30%,執(zhí)行效率遠(yuǎn)高于for語(yǔ)句。所以,當(dāng)foreach和for都可以達(dá)到效果的話(huà),就建議采用foreach了。
2)多使用泛型集合
.NET從2.0版本開(kāi)始,提供了一種強(qiáng)類(lèi)型——泛型。泛型集合不會(huì)出現(xiàn)封箱和拆箱的情況,從而提高了代碼的性能。
3)注意常量和變量的定義
聲明字符串容器這類(lèi)常量時(shí),盡量避免采用把字符放進(jìn)雙引號(hào)中的做法,建議采用先把字符串定義為一個(gè)常量,然后把常量賦值給字符串容器。而對(duì)于循環(huán)體要用到的變量,建議在循環(huán)體外進(jìn)行聲明,然后在循環(huán)體內(nèi)進(jìn)行初始化。
4)合理使用字符串函數(shù)
當(dāng)要對(duì)字符串進(jìn)行不區(qū)分大小的比較時(shí),盡量不采用先用UpperCase和Lowercase轉(zhuǎn)換后再比較的方式,而是直接用String.Compare來(lái)進(jìn)行比較,因?yàn)檫@個(gè)函數(shù)不區(qū)分大小寫(xiě)。
字符串的連接使用是非常頻繁的,很多人習(xí)慣性的用連接符“+”對(duì)string對(duì)象進(jìn)行連接,但這種方法比較浪費(fèi)資源,因?yàn)槊總€(gè)string對(duì)象被創(chuàng)建后是只讀的,每次對(duì)string賦值實(shí)質(zhì)上都是創(chuàng)建了新的string對(duì)象。因此,在.NET中,可以使用StringBuilder類(lèi)中的Insert、Remove和Append等方法來(lái)對(duì)字符串實(shí)行插入、移除和連接等各種操作,這種方法比使用連接符“+”更節(jié)省資源,從而可以提高網(wǎng)站性能。
2.2 優(yōu)化頁(yè)面設(shè)計(jì),加快頁(yè)面響應(yīng)速度
在網(wǎng)站開(kāi)發(fā)中,好的頁(yè)面設(shè)計(jì),特別是優(yōu)化的HTML,可以大大加快頁(yè)面加載速度,減輕服務(wù)器負(fù)擔(dān),從而提高網(wǎng)站的性能,提高用戶(hù)體驗(yàn)。
1)減少頁(yè)面加載對(duì)象的HTTP請(qǐng)求數(shù)量
當(dāng)一個(gè)網(wǎng)頁(yè)被打開(kāi)時(shí),瀏覽器會(huì)發(fā)出加載圖片、腳本等對(duì)象的加載請(qǐng)求,每個(gè)請(qǐng)求都需要響應(yīng)時(shí)間,如果加載的請(qǐng)求太多,會(huì)造成頁(yè)面顯示出現(xiàn)延遲,浪費(fèi)了瀏覽者的時(shí)間。要減少HTT請(qǐng)求數(shù)量,可以從以下幾個(gè)方面進(jìn)行優(yōu)化:
將多個(gè)JS文件或CSS文件合并為一個(gè)文件,如將body.css、side.css、footer.css合并為style.css,這樣就將3個(gè)HTTP請(qǐng)求變成為1個(gè)HTTP請(qǐng)求。
將框架各部分的圖片合并為一張圖片,加載后使用CSS的背景切割功能來(lái)實(shí)現(xiàn),這樣可以加快圖片的顯示。
將腳本、CSS和圖片等文件緩存在本地的Cache中,這樣可以直接在本地調(diào)用,而不用再發(fā)送HTTP加載請(qǐng)求。
2)減小加載文件的大小,減少數(shù)據(jù)傳送量
減小JS和CSS文件的大?。涸贘S或CSS文件中盡量使用簡(jiǎn)短的變量名稱(chēng),刪除注釋、空白內(nèi)容和無(wú)意義換行等,還可以利用服務(wù)器端的GZIP來(lái)壓縮JS和CSS文件的大小。
減小頁(yè)面內(nèi)容:刪除頁(yè)面上冗余的空語(yǔ)句、空白行、注釋、多余的符號(hào)和重復(fù)的頁(yè)面元素的屬性設(shè)置等內(nèi)容。
減小頁(yè)面資源的大?。含F(xiàn)在頁(yè)面包含的圖片、視頻、音頻和動(dòng)畫(huà)等各種多媒體資源越來(lái)越多,盡量少用或者在不影響效果的前提下使用較小的頁(yè)面資源會(huì)大大加快網(wǎng)頁(yè)瀏覽速度。
3)使用良好的頁(yè)面設(shè)計(jì)習(xí)慣,加快頁(yè)面的解釋和加載速度
有些良好的頁(yè)面設(shè)計(jì)習(xí)慣也能加快網(wǎng)頁(yè)的響應(yīng)速度,如:同一個(gè)超鏈接URL字符串在不同頁(yè)面、不同位置保持大小寫(xiě)完全一致;編寫(xiě)HTML代碼時(shí),保證各種標(biāo)記有頭有尾;用表格布局頁(yè)面時(shí),不要把整個(gè)頁(yè)面放在同一個(gè)表格當(dāng)中,而要將頁(yè)面分割成幾個(gè)表格來(lái)布局,這樣就避免了因?yàn)楸砀竦囊徊糠謨?nèi)容無(wú)法訪(fǎng)問(wèn)而影響了整個(gè)頁(yè)面的顯示;不要把javascript房子HTML前面,這樣會(huì)導(dǎo)致瀏覽器在處理javascript時(shí)影響后面網(wǎng)頁(yè)的顯示,所以,最好的辦法是把javascript放到HTML的后面。
2.3 優(yōu)化交互方式,減少服務(wù)器負(fù)載
1)盡量使用靜態(tài)頁(yè)面
動(dòng)態(tài)頁(yè)面使得網(wǎng)頁(yè)與用戶(hù)的交互變得非常方便靈活,也使得網(wǎng)頁(yè)內(nèi)容的變動(dòng)變得簡(jiǎn)單方便。但動(dòng)態(tài)頁(yè)面需要服務(wù)器對(duì)數(shù)據(jù)庫(kù)進(jìn)行各種操作,無(wú)疑增加了服務(wù)器的工作量,會(huì)使網(wǎng)頁(yè)響應(yīng)速度明顯放慢。因此,當(dāng)對(duì)于經(jīng)常要進(jìn)行查詢(xún)而內(nèi)容又變化很少的部分,采用HTML靜態(tài)化策略可以大大減少數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)量。
2)盡量在客戶(hù)端驗(yàn)證用戶(hù)信息
在用戶(hù)登錄或注冊(cè)頁(yè)面,經(jīng)常要對(duì)用戶(hù)輸入的內(nèi)容進(jìn)行合法性、格式、長(zhǎng)度以及邏輯等方面進(jìn)行驗(yàn)證。.NET提供了相關(guān)的類(lèi)庫(kù),讓開(kāi)發(fā)人員省事不少。但這種驗(yàn)證方法都需要回傳服務(wù)器(下轉(zhuǎn)第94頁(yè))(上接第77頁(yè))去處理,降低了網(wǎng)站的性能。所以,應(yīng)該盡量采用JS腳本的方式在客戶(hù)端進(jìn)行驗(yàn)證。
3)關(guān)閉非必須的Session功能
Session的作用是將用戶(hù)的信息保存在服務(wù)器上,當(dāng)有些頁(yè)面需要用戶(hù)授權(quán)時(shí),就會(huì)查詢(xún)session的狀態(tài),但每次這樣的查詢(xún)都會(huì)訪(fǎng)問(wèn)服務(wù)器,當(dāng)大中型網(wǎng)站并發(fā)量大,要使用session狀態(tài)查詢(xún)的頁(yè)面非常多時(shí),對(duì)網(wǎng)站的性能就會(huì)造成一定的影響。所以,當(dāng)有些頁(yè)面沒(méi)必要進(jìn)行用戶(hù)授權(quán)確認(rèn)時(shí),最好關(guān)閉session狀態(tài)。在HTML中關(guān)閉session的方法是:page enablesessionstate=”false”。
2.4 優(yōu)化數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)性能
網(wǎng)頁(yè),特別是動(dòng)態(tài)網(wǎng)頁(yè)需要頻繁地訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),而對(duì)于大中型網(wǎng)站來(lái)說(shuō),由于用戶(hù)并發(fā)量大,頁(yè)面功能多,對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)量是相當(dāng)巨大的,因此,對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)性能進(jìn)行優(yōu)化就顯得非常必要。
1)使用合適的數(shù)據(jù)供應(yīng)器
.NET提供了多種數(shù)據(jù)供應(yīng)器,這些數(shù)據(jù)供應(yīng)器是訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的基礎(chǔ)。比較常用的數(shù)據(jù)供應(yīng)器OLE DB和SQL Server。其中OLE DB主要用于ACCESS、SQL Server、Oracle等數(shù)據(jù)庫(kù),SQL Server則是用于SQL Server7.0以上版本的數(shù)據(jù)庫(kù)。.NET為不同類(lèi)型的數(shù)據(jù)庫(kù)提供了特定的程序,因此。建議不同類(lèi)型的數(shù)據(jù)庫(kù)選擇特定的數(shù)據(jù)供應(yīng)器,這樣會(huì)大大提高數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)性能。
2)及時(shí)關(guān)閉已完成的連接
在大中型網(wǎng)站中,由于訪(fǎng)問(wèn)量巨大,數(shù)據(jù)庫(kù)連接的對(duì)象是非常珍貴的,為了能夠充分利用這些對(duì)象,已經(jīng)打開(kāi)的數(shù)據(jù)庫(kù)連接,應(yīng)該在其使用完后馬上關(guān)閉連接,避免浪費(fèi)系統(tǒng)資源。
3)充分利用數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程是已經(jīng)編譯好的存儲(chǔ)在服務(wù)器上的SQL語(yǔ)句,善于利用存儲(chǔ)過(guò)程可以避免重復(fù)分析和編譯SQL命令,提高了網(wǎng)站的時(shí)效和性能。
此外,為表建立合適的索引、靈活使用視圖、少用游標(biāo)等等措施都能提高數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)性能。
3 總結(jié)
從代碼、頁(yè)面設(shè)計(jì)和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)等等方面對(duì)基于.NET的大中型網(wǎng)站進(jìn)行優(yōu)化,就一可以大大提高系統(tǒng)性能,解決訪(fǎng)問(wèn)量和并發(fā)量巨大帶來(lái)的問(wèn)題。
【參考文獻(xiàn)】
[1]石建斌,劉倩倩.基于用戶(hù)體驗(yàn)優(yōu)化的團(tuán)購(gòu)網(wǎng)站導(dǎo)購(gòu)策略研究[J].電子商務(wù),2014,10.
[2]張?zhí)斓?網(wǎng)站鏈接數(shù)據(jù)分析與優(yōu)化研究[J].牡丹江師范學(xué)院學(xué)報(bào):自然科學(xué)版,2014,4.
[4][美]Adam Sills,Mesbah Ahmed,等.XML.NET編程指南[M].電子工業(yè)出版社,2003,1.
[責(zé)任編輯:湯靜]