|
最近在領(lǐng)導(dǎo)的要求下做了一下項(xiàng)目的優(yōu)化,總結(jié)如下:
1. 使用存儲(chǔ)過程(如果在程序里用exec 存儲(chǔ)過程參數(shù),這樣執(zhí)行似乎并沒有快多少)。
在數(shù)據(jù)庫里是預(yù)編譯的,也不需要在字符串傳輸上花費(fèi)大量時(shí)間。 防sql注入攻擊。
2. 盡量優(yōu)化數(shù)據(jù)庫語句,使邏輯盡量簡單
a) 還有就是在使用函數(shù)時(shí),charindex >like > padindex 效率依次遞減。
b) 查詢字段是否包含在以,分隔的字段串時(shí),最好不要用in 速度非常慢。
還有好多,可以總結(jié)的,這里就不再描述了。
3. EnableViewState(頁面的視圖狀態(tài))。如果無特殊要求設(shè)置為false。
使用ViewState,每個(gè)對(duì)象都必須先序列化到ViewState中,然后再通過回傳進(jìn)行反序列化,因此使用ViewState是有代價(jià)的。盡量減少使用對(duì)象,如果可能,盡量減少放入ViewState中的對(duì)象的數(shù)目。下面情況基本上可以禁用ViewState:
(1) 頁面控件 (.ascx)。
(2) 頁面不回傳給自身。
(3) 無需對(duì)控件的事件處理。
(4) 控件沒有動(dòng)態(tài)的或數(shù)據(jù)綁定的屬性值(或?qū)τ诿總€(gè)postpack都在代碼中處理)。
單個(gè)頁面或每個(gè)頁面都禁用 ViewState,如下所示:
單個(gè)頁面:<%@ Page EnableViewState="False" %>
每個(gè)頁面:在 web.config 中 <Pages EnableViewState="false" />
EnableSessionState保持默認(rèn)值即可(如果頁面用到sessionstate它才會(huì)占用資源)。
EnableViewStateMac如果無安全上的特殊要求,保持默認(rèn)值。
4. Pagelayout頁面布局模型
建議使用Flowlayout(元素不帶絕對(duì)定位屬性添加)。Gridlayout(絕對(duì)定位屬性)由于采用絕對(duì)定位,將會(huì)比Flowlayout生產(chǎn)更多的代碼,主要是控件的定位信息。radiobuttonlist和checkboxlist等
5. 項(xiàng)目發(fā)布的時(shí)候切記解除頁面的Debug狀態(tài)
6. 盡量選擇html控件
能在客戶端實(shí)現(xiàn)的功能就在客戶端實(shí)現(xiàn)(熟練掌握JavaScript),減少服務(wù)器的壓力。數(shù)據(jù)控件選擇順序:Repeater、DataList、DataGrid。
7. 在建立數(shù)據(jù)庫連接后只有在真正需要操作時(shí)才打開連接,使用完畢后馬上關(guān)閉,從而盡量減少數(shù)據(jù)庫連接打開的時(shí)間,避免出現(xiàn)超出連接限制的情況。
8. 字符串操作性能優(yōu)化
(1) 使用值類型的ToString方法。
在連接字符串時(shí),經(jīng)常使用"+"號(hào)直接將數(shù)字添加到字符串中。這種方法雖然簡單,也可以得到正確結(jié)果,但是由于涉及到不同的數(shù)據(jù)類型,數(shù)字需要通過裝箱操作 ,轉(zhuǎn)化為引用類型才可以添加到字符串中。但是裝箱操作對(duì)性能影響較大,因?yàn)樵谶M(jìn)行這類處理時(shí),將在托管堆中分配一個(gè)新的對(duì)象,原有的值復(fù)制到新創(chuàng)建的對(duì)象中。使用值類型的ToString方法可以避免裝箱操作,從而提高應(yīng)用程序性能。
(2) 運(yùn)用StringBuilder類
String類對(duì)象是不可改變的,對(duì)于String對(duì)象的重新賦值在本質(zhì)上是重新創(chuàng)建了一個(gè)String對(duì)象并將新值賦予該對(duì)象,其方法ToString對(duì)性能的提高并非很顯著。在處理字符串時(shí),最好使用StringBuilder類,其.NET 命名空間是System.Text。該類并非創(chuàng)建新的對(duì)象,而是通過Append,Remove,Insert等方法直接對(duì)字符串進(jìn)行操作,通過 ToString方法返回操作結(jié)果。
9. 只要可能就緩存數(shù)據(jù)或頁輸出
ASP.NET 提供了一些簡單的機(jī)制,它們會(huì)在不需要為每個(gè)頁請(qǐng)求動(dòng)態(tài)計(jì)算頁輸出或數(shù)據(jù)時(shí)緩存這些頁輸出或數(shù)據(jù)。另外,通過設(shè)計(jì)要進(jìn)行緩存的頁和數(shù)據(jù)請(qǐng)求(特別是在站點(diǎn)中預(yù)期將有較大通訊量的區(qū)域),可以優(yōu)化這些頁的性能。與.NET Framework的任何Web窗體功能相比,適當(dāng)?shù)厥褂镁彺婵梢愿玫奶岣哒军c(diǎn)的性能,有時(shí)這種提高是超數(shù)量級(jí)的。使用ASP.NET緩存機(jī)制有兩點(diǎn)需要注意。首先,不要緩存太多項(xiàng)。緩存每個(gè)項(xiàng)均有開銷,特別是在內(nèi)存使用方面。不要緩存容易重新計(jì)算和很少使用的項(xiàng)。其次,給緩存的項(xiàng)分配的有效期不要太短。很快到期的項(xiàng)會(huì)導(dǎo)致緩存中不必要的周轉(zhuǎn),并且經(jīng)常導(dǎo)致更多的代碼清除和垃圾回收工作。若關(guān)心此問題,請(qǐng)監(jiān)視與ASP.NET Applications 性能對(duì)象關(guān)聯(lián)的Cache Total Turnover Rate性能計(jì)數(shù)器。高周轉(zhuǎn)率可能說明存在問題,特別是當(dāng)項(xiàng)在到期前被移除時(shí)。這也稱作內(nèi)存壓力。
10. 使用 HttpServerUtility.Transfer 方法在同一應(yīng)用程序的頁面間重定向
采用 Server.Transfer 語法,在頁面中使用該方法可避免不必要的客戶端重定向。但要根據(jù)情況區(qū)分Response.Redirect .Response.Execute的使用方法,區(qū)別對(duì)待。
11 .適當(dāng)?shù)厥褂霉舱Z言運(yùn)行庫的垃圾回收器和自動(dòng)內(nèi)存管理
小心不要給每個(gè)請(qǐng)求分配過多內(nèi)存,因?yàn)檫@樣垃圾回收器將必須更頻繁地進(jìn)行更多的工作。另外,不要讓不必要的指針指向?qū)ο螅驗(yàn)樗鼈儗⑹箤?duì)象保持活動(dòng)狀態(tài),并且應(yīng)盡量避免含F(xiàn)inalize方法的對(duì)象,因?yàn)樗鼈冊(cè)诤竺鏁?huì)導(dǎo)致更多的工作。特別是在 Finalize 調(diào)用中永遠(yuǎn)不要釋放資源,因?yàn)橘Y源在被垃圾回收器回收之前可能一直消耗著內(nèi)存。最后這個(gè)問題經(jīng)常會(huì)對(duì)Web服務(wù)器環(huán)境的性能造成毀滅性的打擊,因?yàn)樵诘却?Finalize 運(yùn)行時(shí),很容易耗盡某個(gè)特定的資源。
12. 不要依賴代碼中的異常
因?yàn)楫惓4蟠蟮亟档托阅埽阅粦?yīng)該將它們用作控制正常程序流程的方式。如果有可能檢測到代碼中可能導(dǎo)致異常的狀態(tài),請(qǐng)執(zhí)行這種操作。不要在處理該狀態(tài)之前捕獲異常本身。常見的方案包括:檢查null,分配給將分析為數(shù)字值的String 一個(gè)值,或在應(yīng)用數(shù)學(xué)運(yùn)算前檢查特定值。
13. 使用HttpResponse.Write方法進(jìn)行字符串串聯(lián)
該方法提供非常有效的緩沖和連接服務(wù)。但是,如果您正在執(zhí)行廣泛的連接,請(qǐng)使用多個(gè)Response.Write 調(diào)用。下面示例中顯示的技術(shù)比用對(duì)Response.Write 方法的單個(gè)調(diào)用連接字符串更快。
Response.Write("atest");
Response.Write(strString);
Response.Write("boxbig");
14. 除非有特殊的原因要關(guān)閉緩沖,否則使其保持打開。
禁用 Web 窗體頁的緩沖會(huì)導(dǎo)致大量的性能開銷。
15. 避免到服務(wù)器的不必要的往返過程
使用Page.IsPostBack避免對(duì)往返過程執(zhí)行不必要的處理。
雖然您很可能希望盡量多地使用Web窗體頁框架的那些節(jié)省時(shí)間和代碼的功能,但在某些情況下卻不宜使用 ASP.NET 服務(wù)器控件和回發(fā)事件處理。通常,只有在檢索或存儲(chǔ)數(shù)據(jù)時(shí),您才需要啟動(dòng)到服務(wù)器的往返過程。多數(shù)數(shù)據(jù)操作可在這些往返過程間的客戶端上進(jìn)行。
在對(duì)ASP.NET應(yīng)用程序進(jìn)行性能測試之前,應(yīng)確保應(yīng)用程序沒有錯(cuò)誤,而且功能正確。具體的性能測試可以采用以下工具進(jìn)行:Web Application Strees Tool (WAS)是Microsoft發(fā)布的一個(gè)免費(fèi)測試工具。它可以模擬成百上千個(gè)用戶同時(shí)對(duì)Web應(yīng)用程序進(jìn)行訪問請(qǐng)求,在服務(wù)器上形成流量負(fù)載,從而達(dá)到測試的目的,可以生成平均TTFB、平均TTLB等性能匯總報(bào)告。 Application Center Test (ACT) 是一個(gè)測試工具,附帶于Visual Studio.NET的企業(yè)版中,是Microsoft正式支持的Web應(yīng)用程序測試工具。它能夠直觀地生成圖表結(jié)果,功能比WAS多,但不具備多個(gè)客戶機(jī)同時(shí)測試的能力。服務(wù)器操作系統(tǒng)"管理工具"中的"性能"計(jì)數(shù)器,可以對(duì)服務(wù)器進(jìn)行監(jiān)測以了解應(yīng)用程序性能。微軟還是出了IIS日志查看工具 LogParserLizardSetup.msi,LogParser.msi 兩者配合使用。可查看每一個(gè)頁面加載調(diào)用執(zhí)行的時(shí)間。
17. 壓縮js
js在頁面中調(diào)用的大小寫要保持一致,免得緩存了不同的文件,頁面的js可以的話,寫成單位的文件進(jìn)行調(diào)用 。圖片少用jpeg,使用gzip對(duì)網(wǎng)頁進(jìn)行壓縮. 加快頁面展示速度。
18. 把調(diào)用js,盡量寫在頁面底部, 還有viewstate 狀態(tài)也可以重寫到頁面低部, 也可以把viewstate進(jìn)行壓縮。條件是viewstate必要要用的情況之下。
NET技術(shù):性能優(yōu)化總結(jié),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。