ASP.NET中常用的26個(gè)優(yōu)化性能方法(4)_.Net教程
推薦:如何構(gòu)造一個(gè)C#語言的爬蟲程序C#特別適合于構(gòu)造蜘蛛程序,這是因?yàn)樗呀?jīng)內(nèi)置了HTTP訪問和多線程的能力,而這兩種能力對于蜘蛛程序來說都是非常關(guān)鍵的。下面是構(gòu)造一個(gè)蜘蛛程序要解決的關(guān)鍵問題: 、 HTML分析:需要
13. 使請求管線內(nèi)的所有模塊盡可能高效
請求管線內(nèi)的所有模塊在每次請求中都有機(jī)會被運(yùn)行。因此,當(dāng)請求進(jìn)入和離開模塊時(shí)快速地觸發(fā)代碼至關(guān)重要,特別是在不使用模塊功能的代碼路徑里。分別在使用及不使用模塊和配置文件時(shí)執(zhí)行吞吐量測試,對確定這些方法的執(zhí)行速度非常有用。
14. 使用 HttpServerUtility.Transfer 方法在同一應(yīng)用程序的頁面間重定向
采用 Server.Transfer 語法,在頁面中使用該方法可避免不必要的客戶端重定向。
15. 必要時(shí)調(diào)整應(yīng)用程序每個(gè)輔助進(jìn)程的線程數(shù)
ASP.NET 的請求結(jié)構(gòu)試圖在執(zhí)行請求的線程數(shù)和可用資源之間達(dá)到一種平衡。已知一個(gè)使用足夠 CPU 功率的應(yīng)用程序,該結(jié)構(gòu)將根據(jù)可用于請求的 CPU 功率,來決定允許同時(shí)執(zhí)行的請求數(shù)。這項(xiàng)技術(shù)稱作線程門控。但是在某些條件下,線程門控算法不是很有效。通過使用與 ASP.NET Applications 性能對象關(guān)聯(lián)的 Pipeline Instance Count 性能計(jì)數(shù)器,可以在 PerfMon 中監(jiān)視線程門控。當(dāng)頁面調(diào)用外部資源,如數(shù)據(jù)庫訪問或 XML Web services 請求時(shí),頁面請求通常停止并釋放 CPU。如果某個(gè)請求正在等待被處理,并且線程池中有一個(gè)線程是自由的,那么這個(gè)正在等待的請求將開始被處理。遺憾的是,有時(shí)這可能導(dǎo)致 Web 服務(wù)器上存在大量同時(shí)處理的請求和許多正在等待的線程,而它們對服務(wù)器性能有不利影響。通常,如果門控因子是外部資源的響應(yīng)時(shí)間,則讓過多請求等待資源,對 Web 服務(wù)器的吞吐量并無幫助。為緩和這種情況,可以通過更改 Machine.config 配置文件節(jié)點(diǎn)的 maxWorkerThreads 和 maxIOThreads 屬性,手動設(shè)置進(jìn)程中的線程數(shù)限制。
注意:輔助線程是用來處理 ASP.NET 請求的,而 IO 線程則是用于為來自文件、數(shù)據(jù)庫或 XML Web services 的數(shù)據(jù)提供服務(wù)的。分配給這些屬性的值是進(jìn)程中每個(gè) CPU 每類線程的最大數(shù)目。對于雙處理器計(jì)算機(jī),最大數(shù)是設(shè)置值的兩倍。對于四處理器計(jì)算機(jī),最大值是設(shè)置值的四倍。無論如何,對于有四個(gè)或八個(gè) CPU 的計(jì)算機(jī),最好更改默認(rèn)值。對于有一個(gè)或兩個(gè)處理器的計(jì)算機(jī),默認(rèn)值就可以,但對于有更多處理器的計(jì)算機(jī)的性能,進(jìn)程中有一百或兩百個(gè)線程則弊大于利。注意進(jìn)程中有太多線程往往會降低服務(wù)器的速度,因?yàn)轭~外的上下文交換導(dǎo)致操作系統(tǒng)將 CPU 周期花在維護(hù)線程而不是處理請求上。
16. 適當(dāng)?shù)厥褂霉舱Z言運(yùn)行庫的垃圾回收器和自動內(nèi)存管理
小心不要給每個(gè)請求分配過多內(nèi)存,因?yàn)檫@樣垃圾回收器將必須更頻繁地進(jìn)行更多的工作。另外,不要讓不必要的指針指向?qū)ο,因(yàn)樗鼈儗⑹箤ο蟊3只顒訝顟B(tài),并且應(yīng)盡量避免含 Finalize 方法的對象,因?yàn)樗鼈冊诤竺鏁䦟?dǎo)致更多的工作。特別是在 Finalize 調(diào)用中永遠(yuǎn)不要釋放資源,因?yàn)橘Y源在被垃圾回收器回收之前可能一直消耗著內(nèi)存。最后這個(gè)問題經(jīng)常會對 Web 服務(wù)器環(huán)境的性能造成毀滅性的打擊,因?yàn)樵诘却?Finalize 運(yùn)行時(shí),很容易耗盡某個(gè)特定的資源。
17. 如果有大型 Web 應(yīng)用程序,可考慮執(zhí)行預(yù)批編譯
每當(dāng)發(fā)生對目錄的第一次請求時(shí)都會執(zhí)行批編譯。如果目錄中的頁面沒有被分析并編譯,此功能會成批分析并編譯目錄中的所有頁面,以便更好地利用磁盤和內(nèi)存。如果這需要很長時(shí)間,則將快速分析并編譯單個(gè)頁面,以便請求能被處理。此功能帶給 ASP.NET 性能上的好處,因?yàn)樗鼘⒃S多頁面編譯為單個(gè)程序集。從已加載的程序集訪問一頁比每頁加載新的程序集要快。批編譯的缺點(diǎn)在于:如果服務(wù)器接收到許多對尚未編譯的頁面的請求,那么當(dāng) Web 服務(wù)器分析并編譯它們時(shí),性能可能較差。為解決這個(gè)問題,可以執(zhí)行預(yù)批編譯。為此,只需在應(yīng)用程序激活之前向它請求一個(gè)頁面,無論哪頁均可。然后,當(dāng)用戶首次訪問您的站點(diǎn)時(shí),頁面及其程序集將已被編譯。沒有簡單的機(jī)制可以知道批編譯何時(shí)發(fā)生。需一直等到 CPU 空閑或者沒有更多的編譯器進(jìn)程(例如 csc.exe(C# 編譯器)或 vbc.exe(Visual Basic 編譯器))啟動。還應(yīng)盡量避免更改應(yīng)用程序的 \bin 目錄中的程序集。更改頁面會導(dǎo)致重新分析和編譯該頁,而替換 \bin 目錄中的程序集則會導(dǎo)致完全重新批編譯該目錄。在包含許多頁面的大規(guī)模站點(diǎn)上,更好的辦法可能是根據(jù)計(jì)劃替換頁面或程序集的頻繁程度來設(shè)計(jì)不同的目錄結(jié)構(gòu)。不常更改的頁面可以存儲在同一目錄中并在特定的時(shí)間進(jìn)行預(yù)批編譯。經(jīng)常更改的頁面應(yīng)在它們自己的目錄中(每個(gè)目錄最多幾百頁)以便快速編譯。Web 應(yīng)用程序可以包含許多子目錄。批編譯發(fā)生在目錄級,而不是應(yīng)用程序級。
18. 不要依賴代碼中的異常
因?yàn)楫惓4蟠蟮亟档托阅,所以您不?yīng)該將它們用作控制正常程序流程的方式。如果有可能檢測到代碼中可能導(dǎo)致異常的狀態(tài),請執(zhí)行這種操作。不要在處理該狀態(tài)之前捕獲異常本身。常見的方案包括:檢查 null,分配給將分析為數(shù)字值的 String 一個(gè)值,或在應(yīng)用數(shù)學(xué)運(yùn)算前檢查特定值。下面的示例演示可能導(dǎo)致異常的代碼以及測試是否存在某種狀態(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; |
分享:ASP.NET MVC :實(shí)現(xiàn)我們自己的視圖引擎在ASP.NET MVC的一個(gè)開源項(xiàng)目MvcContrib中,為我們提供了幾個(gè)視圖引擎,例如NVelocity, Brail, NHaml, XSLT。那么如果我們想在ASP.NET MVC中實(shí)現(xiàn)我們自己的一個(gè)視圖引擎,我們應(yīng)該要怎么做呢?
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實(shí)現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- ASP.NET中數(shù)據(jù)庫的操作初步----增加、刪除、修改
- asp.net中“從客戶端中檢測到有潛在危險(xiǎn)的Request.Form值”的錯(cuò)誤
- 淺談ASP.NET的PHP執(zhí)行速度
- 怎樣在ASP.NET項(xiàng)目里面正確使用Linq to Sql
- 基于ERP程序的公共代碼中出現(xiàn)的問題及過度封裝不方便維護(hù)的解決辦法
- ASP.NET 2.0移動開發(fā)入門的使用樣式
- ASP.NET立即上手教程(10)
- 解讀Web.config簡要配置說明
- Attribute高級應(yīng)用:簡化ANF自定義控件初始化過程
- 如何用VB.net實(shí)現(xiàn)sql數(shù)據(jù)庫的備份與恢復(fù)
- 相關(guān)鏈接:
- 教程說明:
.Net教程-ASP.NET中常用的26個(gè)優(yōu)化性能方法(4)
。