前言
前幾篇我們比較基礎的講了下MVC中的知識,這一節我們穿插點知識,講講MVC中我們可以提高性能的辦法。
Razor視圖引擎優化(優化一)
我們知道默認情況下配置MVC去解析一個視圖會首先約定通過查找所有的匹配Web Form視圖引擎的名稱。例如當我們查找一個不存在的視圖時,會出現如下錯誤:
從上面我們可以很明顯的知道,如果我們MVC應用程序中沒有使用ASPX視圖時,當我們在Action方法中通過 return View() 返回視圖或者 Html.RenderPartial 等查找視圖時每次都會檢查上述四個未使用的位置,此時這是相當的耗時而且性能十分低下尤其是當視圖比較龐大時,這樣造成的后果簡直無法想象。我們有沒有什么解決的辦法呢?如下:
移除Web Form視圖引擎
在MVC中移除Web Form視圖引擎非常簡單,我們需要移除所有的Web Form視圖引擎僅僅留下Razor視圖引擎,我們在Global.asax.cs的Application_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緩存
對於客戶端資源優化,服務資源只有在發布模式下才會包括在緩存頭中,在調試模式下根本不會去進行緩存。
參考
A harsh reminder about the importance of debug=”false”
結語
這節我們大概通過對內置默認的一些配置進行修改來提高MVC應用程序性能,希望對閱讀本文的你有所幫助,下節我們繼續進行MVC系列講解。