ASP.NET MVC之如何看待內建配置來提高效能優化(四)

風靈使發表於2018-05-27

前言

前幾篇我們比較基礎的講了下MVC中的知識,這一節我們穿插點知識,講講MVC中我們可以提高效能的辦法。

Razor檢視引擎優化(優化一)

我們知道預設情況下配置MVC去解析一個檢視會首先約定通過查詢所有的匹配Web Form檢視引擎的名稱。例如當我們查詢一個不存在的檢視時,會出現如下錯誤:
這裡寫圖片描述
從上面我們可以很明顯的知道,如果我們MVC應用程式中沒有使用ASPX檢視時,當我們在Action方法中通過 return View() 返回檢視或者 Html.RenderPartial 等查詢檢視時每次都會檢查上述四個未使用的位置,此時這是相當的耗時而且效能十分低下尤其是當檢視比較龐大時,這樣造成的後果簡直無法想象。我們有沒有什麼解決的辦法呢?如下:

移除Web Form檢視引擎

在MVC中移除Web Form檢視引擎非常簡單,我們需要移除所有的Web Form檢視引擎僅僅留下Razor檢視引擎,我們在Global.asax.csApplication_Start事件中新增如下程式碼:

            //移除所有檢視引擎
            ViewEngines.Engines.Clear();

           //新增Razor檢視引擎
            ViewEngines.Engines.Add(new RazorViewEngine());   

此時我們再來執行下程式:
這裡寫圖片描述
我們成功的移除了ASPX檢視引擎。

注意 :通過上述移除Web Form檢視引擎,此時我們基於Razor檢視引擎查詢匹配的第一個檢視就是正確的,所以此時Razor檢視引擎的效能較比之前接近將提升兩倍,當然這樣使用必須要有前提,確保我們的MVC應用程式中不會用到Web Form,如果我們既想使用Razor檢視引擎又想使用ASPX檢視引擎則不能那麼做。

設定Debug = false(優化二)

在MVC中除錯模式和釋出模式對MVC應用程式究竟有什麼不同呢?

Debug Mode (除錯模式)

在除錯模式下,檢視解析有利於開發中進行優化,通過檢視解析一次又一次請求我們的程式碼最終渲染成一個有名稱的檢視被稱為檢視迭代,這種作用是很顯而易見的,當我們在進行實際開發時對程式碼進行了更改我們需要環境立即做出響應。

Release Mode(釋出模式)

在釋出模式下,MVC的檢視解析有利於效能的優化,當一個檢視在釋出模式下被正確解析了,此時會快取該搜尋的結果,當再次遇到以該檢視命名的引用時不需要在另外一個檔案系統中進行搜尋。

通過上述描述我們能夠理解如果模式是在釋出模式下在第一次被解析後,其結果是能夠被快取的,雖然在檢視引擎中Web Form檢視引擎優先於Razor檢視引擎執行,但是主要在第一次被解析後其結果會被快取,所以其帶來的影響可以忽略不計。只要我們的生產環境不是在除錯模式下,這個檢視解析問題可以完全被消除。

那麼問題來了,設定Debug = false僅僅是為了檢視引擎? 顯然不是,我們接著往下看。

檢視解析快取只是一個為了確保我們的網站沒有執行在除錯模式下眾多中的一個理由,其實還有其他嚴重缺點。

(1)超時問題(Timeouts)

不知道你是否注意到,我們曾花大量的時間在沒有暫停的請求超時問題下進行著除錯,這是因為我們設定【debug=”true”】完全禁止了請求超時,很顯然這在一個已上線的網站上這樣做不是一個好主意。

(2)捆綁和壓縮(Bundling and Minification)

貌似聽到這兩個詞感覺很陌生對吧,我們一一來看你就恍然大悟了。

在建立專案App_Start資料夾下有個 BundleConfig 配置,這個就是用來捆綁指令碼和壓縮指令碼以及樣式的配置檔案。例如我們現在將jquery指令碼進行捆綁,如下:

   bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));

此時我們來看看結果:
這裡寫圖片描述
此時我們將配置檔案中模式進行如下更改:
這裡寫圖片描述
我們再來看看結果:
這裡寫圖片描述
這就驗證了我們的觀點,如果是在釋出模式下它將會自動進行捆綁和壓縮,但是當我們在配置檔案中將【debug=”true”】此時將不會縮小、也不會繫結指令碼組合從而達不到縮短請求時間的目的。很顯然在開發中除錯時這是非常重要的,但是其違背了我們在生產環境進行了效能優化的基本準則,這一點我們需要注意。

對於上述對於捆綁和壓縮指令碼或者樣式的問題,有人就會想了,我們可以通過程式碼來進行顯示啟動,如下在BundleConfig配置檔案中進行設定也是可以的:

 BundleTable.EnableOptimizations = true;

通過上述程式碼即使在Web.Config檔案中將模式設定為了【Debug=”true”】此時也會啟動壓縮和捆綁指令碼或者樣式,因為其顯式覆蓋了在Web.Config環境中的設定。

(3)WebResource.axd快取

對於客戶端資源優化,服務資源只有在釋出模式下才會包括在快取頭中,在除錯模式下根本不會去進行快取。

相關文章