接上篇,文章由北京北大青鳥(niǎo)學(xué)校學(xué)術(shù)部老師提供:
相關(guān)文章:ASP.NET中優(yōu)化性能的方法(三)
16. 適當(dāng)?shù)厥褂霉舱Z(yǔ)言運(yùn)行庫(kù)的垃圾回收器和自動(dòng)內(nèi)存管理
北京北大青鳥(niǎo)學(xué)校提示:不要給每個(gè)請(qǐng)求分配過(guò)多內(nèi)存,因?yàn)檫@樣垃圾回收器將必須更頻繁地進(jìn)行更多的工作。另外,不要讓不必要的指針指向?qū)ο�,因�(yàn)樗鼈儗⑹箤?duì)象保持活動(dòng)狀態(tài),并且應(yīng)盡量避免含 Finalize 方法的對(duì)象,因?yàn)樗鼈冊(cè)诤竺鏁?huì)導(dǎo)致更多的工作。特別是在 Finalize 調(diào)用中永遠(yuǎn)不要釋放資源,因?yàn)橘Y源在被垃圾回收器回收之前可能一直消耗著內(nèi)存。最后這個(gè)問(wèn)題經(jīng)常會(huì)對(duì) Web 服務(wù)器環(huán)境的性能造成毀滅性的打擊,因?yàn)樵诘却?Finalize 運(yùn)行時(shí),很容易耗盡某個(gè)特定的資源。
17. 如果有大型 Web 應(yīng)用程序,可考慮執(zhí)行預(yù)批編譯
每當(dāng)發(fā)生對(duì)目錄的第一次請(qǐng)求時(shí)都會(huì)執(zhí)行批編譯。如果目錄中的頁(yè)面沒(méi)有被分析并編譯,此功能會(huì)成批分析并編譯目錄中的所有頁(yè)面,以便更好地利用磁盤(pán)和內(nèi)存。如果這需要很長(zhǎng)時(shí)間,則將快速分析并編譯單個(gè)頁(yè)面,以便請(qǐng)求能被處理。此功能帶給 ASP.NET 性能上的好處,因?yàn)樗鼘⒃S多頁(yè)面編譯為單個(gè)程序集。從已加載的程序集訪問(wèn)一頁(yè)比每頁(yè)加載新的程序集要快。批編譯的缺點(diǎn)在于:如果服務(wù)器接收到許多對(duì)尚未編譯的頁(yè)面的請(qǐng)求,那么當(dāng) Web 服務(wù)器分析并編譯它們時(shí),性能可能較差。
為解決這個(gè)問(wèn)題,北京北大青鳥(niǎo)學(xué)校的建議是,可以執(zhí)行預(yù)批編譯。為此,只需在應(yīng)用程序激活之前向它請(qǐng)求一個(gè)頁(yè)面,無(wú)論哪頁(yè)均可。然后,當(dāng)用戶首次訪問(wèn)您的站點(diǎn)時(shí),頁(yè)面及其程序集將已被編譯。沒(méi)有簡(jiǎn)單的機(jī)制可以知道批編譯何時(shí)發(fā)生。需一直等到 CPU 空閑或者沒(méi)有更多的編譯器進(jìn)程(例如 csc.exe(C# 編譯器)或 vbc.exe(Visual Basic 編譯器))啟動(dòng)。
還應(yīng)盡量避免更改應(yīng)用程序的 bin 目錄中的程序集。更改頁(yè)面會(huì)導(dǎo)致重新分析和編譯該頁(yè),而替換 bin 目錄中的程序集則會(huì)導(dǎo)致完全重新批編譯該目錄。在包含許多頁(yè)面的大規(guī)模站點(diǎn)上,更好的辦法可能是根據(jù)計(jì)劃替換頁(yè)面或程序集的頻繁程度來(lái)設(shè)計(jì)不同的目錄結(jié)構(gòu)。不常更改的頁(yè)面可以存儲(chǔ)在同一目錄中并在特定的時(shí)間進(jìn)行預(yù)批編譯。經(jīng)常更改的頁(yè)面應(yīng)在它們自己的目錄中(每個(gè)目錄最多幾百頁(yè))以便快速編譯。Web 應(yīng)用程序可以包含許多子目錄。批編譯發(fā)生在目錄級(jí),而不是應(yīng)用程序級(jí)。(北京北大青鳥(niǎo)學(xué)校)
18. 不要依賴代碼中的異�! �
因?yàn)楫惓4蟠蟮亟档托阅�,所以不�?yīng)該將它們用作控制正常程序流程的方式。如果有可能檢測(cè)到代碼中可能導(dǎo)致異常的狀態(tài),請(qǐng)執(zhí)行這種操作。不要在處理該狀態(tài)之前捕獲異常本身。常見(jiàn)的方案包括:檢查 null,分配給將分析為數(shù)字值的 String 一個(gè)值,或在應(yīng)用數(shù)學(xué)運(yùn)算前檢查特定值。下面的示例演示可能導(dǎo)致異常的代碼以及測(cè)試是否存在某種狀態(tài)的代碼。兩者產(chǎn)生相同的結(jié)果。
try { result = 100 / num; } catch (Exception e) { result = 0; } // ...to this. if (num != 0) result = 100 / num; else result = 0;
(北京北大青鳥(niǎo)學(xué)校,未完待續(xù))