2020年03月10日
随着計算機性能、網絡技術的(of)不(No)斷提高,以(by)及高性能寬帶的(of)大(big)規模普及,人(people)們(them)訪問網站的(of)速度越來(Come)越快,計算機處理網頁功能的(of)能力也越來(Come)越強,以(by)至于(At)使很多人(people)都進入了(Got it)一(one)個(indivual)誤區:現在(exist)開發網站,主要(want)精力應該放在(exist)頁面設計和(and)功能的(of)實現上(superior),而性能的(of)優化已經無足輕重。這(this)種想法在(exist)開發訪問量和(and)數據量小的(of)小型網站的(of)時(hour)候可能危害還不(No)明顯,但在(exist)開發訪問量和(and)數據量極大(big)的(of)大(big)中型網站時(hour)就存在(exist)着極大(big)的(of)隐患了(Got it),很可能造成網站的(of)反應速度慢,甚至在(exist)并發量高的(of)時(hour)候造成網站的(of)崩潰。
Microsoft .NET憑着平台無關性、多開發語言支持、豐富的(of)類庫以(by)及強大(big)的(of)WebService功能等特性,成爲(for)了(Got it)目前大(big)部分的(of)大(big)中型網站首先的(of)方法。因此,加強對基于(At).NET的(of)大(big)中型網站的(of)性能優化研究就顯得非常必要(want)和(and)有意義了(Got it)。
1 Microsoft .NET概述
Microsoft.NET是(yes)微軟開發的(of)以(by)Webservices爲(for)核心的(of)新一(one)代技術平台,通過這(this)個(indivual)平台,各種互聯網上(superior)的(of)應用(use)程序可以(by)進行互聯,而無需理會這(this)些應用(use)程序是(yes)用(use)什麽編程語言開發的(of)、是(yes)運行在(exist)哪種設備和(and)操作(do)系統上(superior)。開發人(people)員可以(by)使用(use)C#、VB、VC++和(and)java等語言來(Come)開發各種基于(At).NET的(of)應用(use)程序,編譯後的(of)應用(use)程序可以(by)運行在(exist)裝有.NET Framework的(of)任意平台上(superior),實現一(one)次編譯、到(arrive)處運行的(of)思想。
2 大(big)中型網站的(of)性能優化
大(big)中型網站大(big)都基于(At)Microsoft .NET開發的(of),而開發的(of)語言則不(No)盡相同。要(want)提高這(this)些網站的(of)性能,可以(by)從代碼、頁面設計、交互策略和(and)數據庫連接等方面去優化。
2.1優化代碼,提高代碼執行效率
代碼具有很大(big)的(of)靈活性,實現某一(one)個(indivual)功能,可能會有很多種編碼方式,如果能夠選擇最好的(of)實現方式,則可以(by)提高代碼的(of)執行效率,從而提高網頁的(of)反應速度。
1)使用(use)Foreach代替for語句
在(exist)C#中,foreach的(of)平均執行時(hour)間隻是(yes)for語句的(of)30%,執行效率遠高于(At)for語句。所以(by),當foreach和(and)for都可以(by)達到(arrive)效果的(of)話,就建議采用(use)foreach了(Got it)。
2)多使用(use)泛型集合
.NET從2.0版本開始,提供了(Got it)一(one)種強類型———泛型。泛型集合不(No)會出(out)現封箱和(and)拆箱的(of)情況,從而提高了(Got it)代碼的(of)性能。
3)注意常量和(and)變量的(of)定義
聲明字符串容器這(this)類常量時(hour),盡量避免采用(use)把字符放進雙引号中的(of)做法,建議采用(use)先把字符串定義爲(for)一(one)個(indivual)常量,然後把常量賦值給字符串容器。而對于(At)循環體要(want)用(use)到(arrive)的(of)變量,建議在(exist)循環體外進行聲明,然後在(exist)循環體内進行初始化。
4)合理使用(use)字符串函數
當要(want)對字符串進行不(No)區分大(big)小的(of)比較時(hour),盡量不(No)采用(use)先用(use)UpperCase和(and)Lowercase轉換後再比較的(of)方式,而是(yes)直接用(use)String.Compare來(Come)進行比較,因爲(for)這(this)個(indivual)函數不(No)區分大(big)小寫。字符串的(of)連接使用(use)是(yes)非常頻繁的(of),很多人(people)習慣性的(of)用(use)連接符“+”對string對象進行連接,但這(this)種方法比較浪費資源,因爲(for)每個(indivual)string對象被創建後是(yes)隻讀的(of),每次對string賦值實質上(superior)都是(yes)創建了(Got it)新的(of)string對象。因此,在(exist).NET中,可以(by)使用(use)String Builder類中的(of)Insert、Remove和(and)Append等方法來(Come)對字符串實行插入、移除和(and)連接等各種操作(do),這(this)種方法比使用(use)連接符“+”更節省資源,從而可以(by)提高網站性能。2.2優化頁面設計,加快頁面響應速度在(exist)網站開發中,好的(of)頁面設計,特别是(yes)優化的(of)HTML,可以(by)大(big)大(big)加快頁面加載速度,減輕服務器負擔,從而提高網站的(of)性能,提高用(use)戶體驗。
1)減少頁面加載對象的(of)HTTP
請求數量當一(one)個(indivual)網頁被打開時(hour),浏覽器會發出(out)加載圖片、腳本等對象的(of)加載請求,每個(indivual)請求都需要(want)響應時(hour)間,如果加載的(of)請求太多,會造成頁面顯示出(out)現延遲,浪費了(Got it)浏覽者的(of)時(hour)間。要(want)減少HTT請求數量,可以(by)從以(by)下幾個(indivual)方面進行優化:将多個(indivual)JS文件或CSS文件合并爲(for)一(one)個(indivual)文件,如将body.css、side.css、footer.css合并爲(for)style.css,這(this)樣就将3個(indivual)HTTP請求變成爲(for)1個(indivual)HTTP請求。将框架各部分的(of)圖片合并爲(for)一(one)張圖片,加載後使用(use)CSS的(of)背景切割功能來(Come)實現,這(this)樣可以(by)加快圖片的(of)顯示。将腳本、CSS和(and)圖片等文件緩存在(exist)本地(land)的(of)Cache中,這(this)樣可以(by)直接在(exist)本地(land)調用(use),而不(No)用(use)再發送HTTP加載請求。
2)減小加載文件的(of)大(big)小,減少數據傳送量
減小JS和(and)CSS文件的(of)大(big)小:在(exist)JS或CSS文件中盡量使用(use)簡短的(of)變量名稱,删除注釋、空白内容和(and)無意義換行等,還可以(by)利用(use)服務器端的(of)GZIP來(Come)壓縮JS和(and)CSS文件的(of)大(big)小。減小頁面内容:删除頁面上(superior)冗餘的(of)空語句、空白行、注釋、多餘的(of)符号和(and)重複的(of)頁面元素的(of)屬性設置等内容。減小頁面資源的(of)大(big)小:現在(exist)頁面包含的(of)圖片、視頻、音頻和(and)動畫等各種多媒體資源越來(Come)越多,盡量少用(use)或者在(exist)不(No)影響效果的(of)前提下使用(use)較小的(of)頁面資源會大(big)大(big)加快網頁浏覽速度。
3)使用(use)良好的(of)頁面設計習慣,加快頁面的(of)解釋和(and)加載速度
有些良好的(of)頁面設計習慣也能加快網頁的(of)響應速度,如:同一(one)個(indivual)超鏈接URL字符串在(exist)不(No)同頁面、不(No)同位置保持大(big)小寫完全一(one)緻;編寫HTML代碼時(hour),保證各種标記有頭有尾;用(use)表格布局頁面時(hour),不(No)要(want)把整個(indivual)頁面放在(exist)同一(one)個(indivual)表格當中,而要(want)将頁面分割成幾個(indivual)表格來(Come)布局,這(this)樣就避免了(Got it)因爲(for)表格的(of)一(one)部分内容無法訪問而影響了(Got it)整個(indivual)頁面的(of)顯示;不(No)要(want)把javascript房子HTML前面,這(this)樣會導緻浏覽器在(exist)處理javascript時(hour)影響後面網頁的(of)顯示,所以(by),最好的(of)辦法是(yes)把javascript放到(arrive)HTML的(of)後面。
2.3優化交互方式,減少服務器負載
1)盡量使用(use)靜态頁面
動态頁面使得網頁與用(use)戶的(of)交互變得非常方便靈活,也使得網頁内容的(of)變動變得簡單方便。但動态頁面需要(want)服務器對數據庫進行各種操作(do),無疑增加了(Got it)服務器的(of)工作(do)量,會使網頁響應速度明顯放慢。因此,當對于(At)經常要(want)進行查詢而内容又變化很少的(of)部分,采用(use)HTML靜态化策略可以(by)大(big)大(big)減少數據庫的(of)訪問量。
2)盡量在(exist)客戶端驗證用(use)戶信息
在(exist)用(use)戶登錄或注冊頁面,經常要(want)對用(use)戶輸入的(of)内容進行合法性、格式、長度以(by)及邏輯等方面進行驗證。.NET提供了(Got it)相關的(of)類庫,讓開發人(people)員省事不(No)少。但這(this)種驗證方法都需要(want)回傳服務器去處理,降低了(Got it)網站的(of)性能。所以(by),應該盡量采用(use)JS腳本的(of)方式在(exist)客戶端進行驗證。
3)關閉非必須的(of)Session功能
Session的(of)作(do)用(use)是(yes)将用(use)戶的(of)信息保存在(exist)服務器上(superior),當有些頁面需要(want)用(use)戶授權時(hour),就會查詢session的(of)狀态,但每次這(this)樣的(of)查詢都會訪問服務器,當大(big)中型網站并發量大(big),要(want)使用(use)session狀态查詢的(of)頁面非常多時(hour),對網站的(of)性能就會造成一(one)定的(of)影響。所以(by),當有些頁面沒必要(want)進行用(use)戶授權确認時(hour),最好關閉session狀态。在(exist)HTML中關閉session的(of)方法是(yes):page enablesessionstate=”false”。
2.4優化數據庫訪問性能
網頁,特别是(yes)動态網頁需要(want)頻繁地(land)訪問數據庫,而對于(At)大(big)中型網站來(Come)說,由于(At)用(use)戶并發量大(big),頁面功能多,對數據庫的(of)訪問量是(yes)相當巨大(big)的(of),因此,對數據庫的(of)訪問性能進行優化就顯得非常必要(want)。
1)使用(use)合适的(of)數據供應器
.NET提供了(Got it)多種數據供應器,這(this)些數據供應器是(yes)訪問數據庫的(of)基礎。比較常用(use)的(of)數據供應器OLEDB和(and)SQLServer。其中OLEDB主要(want)用(use)于(At)ACCESS、SQLServer、Oracle等數據庫,SQLServer則是(yes)用(use)于(At)SQL Server7.0以(by)上(superior)版本的(of)數據庫。.NET爲(for)不(No)同類型的(of)數據庫提供了(Got it)特定的(of)程序,因此。建議不(No)同類型的(of)數據庫選擇特定的(of)數據供應器,這(this)樣會大(big)大(big)提高數據庫的(of)訪問性能。
2)及時(hour)關閉已完成的(of)連接
在(exist)大(big)中型網站中,由于(At)訪問量巨大(big),數據庫連接的(of)對象是(yes)非常珍貴的(of),爲(for)了(Got it)能夠充分利用(use)這(this)些對象,已經打開的(of)數據庫連接,應該在(exist)其使用(use)完後馬上(superior)關閉連接,避免浪費系統資源。
3)充分利用(use)數據庫的(of)存儲過程
存儲過程是(yes)已經編譯好的(of)存儲在(exist)服務器上(superior)的(of)SQL語句,善于(At)利用(use)存儲過程可以(by)避免重複分析和(and)編譯SQL命令,提高了(Got it)網站的(of)時(hour)效和(and)性能。此外,爲(for)表建立合适的(of)索引、靈活使用(use)視圖、少用(use)遊标等等措施都能提高數據庫的(of)訪問性能。
3 總結
從代碼、頁面設計和(and)數據庫訪問等等方面對基于(At) .NET的(of)大(big)中型網站進行優化,就一(one)可以(by)大(big)大(big)提高系統性能,解決訪問量和(and)并發量巨大(big)帶來(Come)的(of)問題。