ASP.NET中常用的26個優化性能方法(4)_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:如何構造一個C#語言的爬蟲程序
      C#特別適合于構造蜘蛛程序,這是因為它已經內置了HTTP訪問和多線程的能力,而這兩種能力對于蜘蛛程序來說都是非常關鍵的。下面是構造一個蜘蛛程序要解決的關鍵問題:  、 HTML分析:需要

      13. 使請求管線內的所有模塊盡可能高效  

      請求管線內的所有模塊在每次請求中都有機會被運行。因此,當請求進入和離開模塊時快速地觸發代碼至關重要,特別是在不使用模塊功能的代碼路徑里。分別在使用及不使用模塊和配置文件時執行吞吐量測試,對確定這些方法的執行速度非常有用。

      14. 使用 HttpServerUtility.Transfer 方法在同一應用程序的頁面間重定向  

      采用 Server.Transfer 語法,在頁面中使用該方法可避免不必要的客戶端重定向。
        
      15. 必要時調整應用程序每個輔助進程的線程數  

      ASP.NET 的請求結構試圖在執行請求的線程數和可用資源之間達到一種平衡。已知一個使用足夠 CPU 功率的應用程序,該結構將根據可用于請求的 CPU 功率,來決定允許同時執行的請求數。這項技術稱作線程門控。但是在某些條件下,線程門控算法不是很有效。通過使用與 ASP.NET Applications 性能對象關聯的 Pipeline Instance Count 性能計數器,可以在 PerfMon 中監視線程門控。當頁面調用外部資源,如數據庫訪問或 XML Web services 請求時,頁面請求通常停止并釋放 CPU。如果某個請求正在等待被處理,并且線程池中有一個線程是自由的,那么這個正在等待的請求將開始被處理。遺憾的是,有時這可能導致 Web 服務器上存在大量同時處理的請求和許多正在等待的線程,而它們對服務器性能有不利影響。通常,如果門控因子是外部資源的響應時間,則讓過多請求等待資源,對 Web 服務器的吞吐量并無幫助。為緩和這種情況,可以通過更改 Machine.config 配置文件節點的 maxWorkerThreads 和 maxIOThreads 屬性,手動設置進程中的線程數限制。   

      注意:輔助線程是用來處理 ASP.NET 請求的,而 IO 線程則是用于為來自文件、數據庫或 XML Web services 的數據提供服務的。分配給這些屬性的值是進程中每個 CPU 每類線程的最大數目。對于雙處理器計算機,最大數是設置值的兩倍。對于四處理器計算機,最大值是設置值的四倍。無論如何,對于有四個或八個 CPU 的計算機,最好更改默認值。對于有一個或兩個處理器的計算機,默認值就可以,但對于有更多處理器的計算機的性能,進程中有一百或兩百個線程則弊大于利。注意進程中有太多線程往往會降低服務器的速度,因為額外的上下文交換導致操作系統將 CPU 周期花在維護線程而不是處理請求上。   

      16. 適當地使用公共語言運行庫的垃圾回收器和自動內存管理  

      小心不要給每個請求分配過多內存,因為這樣垃圾回收器將必須更頻繁地進行更多的工作。另外,不要讓不必要的指針指向對象,因為它們將使對象保持活動狀態,并且應盡量避免含 Finalize 方法的對象,因為它們在后面會導致更多的工作。特別是在 Finalize 調用中永遠不要釋放資源,因為資源在被垃圾回收器回收之前可能一直消耗著內存。最后這個問題經常會對 Web 服務器環境的性能造成毀滅性的打擊,因為在等待 Finalize 運行時,很容易耗盡某個特定的資源。   

      17. 如果有大型 Web 應用程序,可考慮執行預批編譯  

      每當發生對目錄的第一次請求時都會執行批編譯。如果目錄中的頁面沒有被分析并編譯,此功能會成批分析并編譯目錄中的所有頁面,以便更好地利用磁盤和內存。如果這需要很長時間,則將快速分析并編譯單個頁面,以便請求能被處理。此功能帶給 ASP.NET 性能上的好處,因為它將許多頁面編譯為單個程序集。從已加載的程序集訪問一頁比每頁加載新的程序集要快。批編譯的缺點在于:如果服務器接收到許多對尚未編譯的頁面的請求,那么當 Web 服務器分析并編譯它們時,性能可能較差。為解決這個問題,可以執行預批編譯。為此,只需在應用程序激活之前向它請求一個頁面,無論哪頁均可。然后,當用戶首次訪問您的站點時,頁面及其程序集將已被編譯。沒有簡單的機制可以知道批編譯何時發生。需一直等到 CPU 空閑或者沒有更多的編譯器進程(例如 csc.exe(C# 編譯器)或 vbc.exe(Visual Basic 編譯器))啟動。還應盡量避免更改應用程序的 \bin 目錄中的程序集。更改頁面會導致重新分析和編譯該頁,而替換 \bin 目錄中的程序集則會導致完全重新批編譯該目錄。在包含許多頁面的大規模站點上,更好的辦法可能是根據計劃替換頁面或程序集的頻繁程度來設計不同的目錄結構。不常更改的頁面可以存儲在同一目錄中并在特定的時間進行預批編譯。經常更改的頁面應在它們自己的目錄中(每個目錄最多幾百頁)以便快速編譯。Web 應用程序可以包含許多子目錄。批編譯發生在目錄級,而不是應用程序級。

      18. 不要依賴代碼中的異常  

      因為異常大大地降低性能,所以您不應該將它們用作控制正常程序流程的方式。如果有可能檢測到代碼中可能導致異常的狀態,請執行這種操作。不要在處理該狀態之前捕獲異常本身。常見的方案包括:檢查 null,分配給將分析為數字值的 String 一個值,或在應用數學運算前檢查特定值。下面的示例演示可能導致異常的代碼以及測試是否存在某種狀態的代碼。兩者產生相同的結果。


       try
        {
        result = 100 / num;
        }
        catch (Exception e)
        {
        result = 0;
        }
        // ...to this.
        if (num != 0)
        result = 100 / num;
        else
        result = 0;

      分享:ASP.NET MVC :實現我們自己的視圖引擎
      在ASP.NET MVC的一個開源項目MvcContrib中,為我們提供了幾個視圖引擎,例如NVelocity, Brail, NHaml, XSLT。那么如果我們想在ASP.NET MVC中實現我們自己的一個視圖引擎,我們應該要怎么做呢?

      來源:模板無憂//所屬分類:.Net教程/更新時間:2008-08-22
      相關.Net教程