前幾篇咱們比較基礎的講了下MVC中的知識,這一節咱們穿插點知識,講講MVC中咱們能夠提升性能的辦法。jquery
咱們知道默認狀況下配置MVC去解析一個視圖會首先約定經過查找全部的匹配Web Form視圖引擎的名稱。例如當咱們查找一個不存在的視圖時,會出現以下錯誤:緩存
從上面咱們能夠很明顯的知道,若是咱們MVC應用程序中沒有使用ASPX視圖時,當咱們在Action方法中經過 return View() 返回視圖或者 Html.RenderPartial 等查找視圖時每次都會檢查上述四個未使用的位置,此時這是至關的耗時並且性能十分低下尤爲是當視圖比較龐大時,這樣形成的後果簡直沒法想象。咱們有沒有什麼解決的辦法呢?以下:性能優化
在MVC中移除Web Form視圖引擎很是簡單,咱們須要移除全部的Web Form視圖引擎僅僅留下Razor視圖引擎,咱們在Global.asax.cs的Application_Start事件中添加以下代碼:mvc
//移除全部視圖引擎 ViewEngines.Engines.Clear(); //添加Razor視圖引擎 ViewEngines.Engines.Add(new RazorViewEngine());
此時咱們再來運行下程序:asp.net
咱們成功的移除了ASPX視圖引擎。性能
注意 :經過上述移除Web Form視圖引擎,此時咱們基於Razor視圖引擎查找匹配的第一個視圖就是正確的,因此此時Razor視圖引擎的性能較比以前接近將提高兩倍,固然這樣使用必需要有前提,確保咱們的MVC應用程序中不會用到Web Form,若是咱們既想使用Razor視圖引擎又想使用ASPX視圖引擎則不能那麼作。優化
在MVC中調試模式和發佈模式對MVC應用程序究竟有什麼不一樣呢?網站
在調試模式下,視圖解析有利於開發中進行優化,經過視圖解析一次又一次請求咱們的代碼最終渲染成一個有名稱的視圖被稱爲視圖迭代,這種做用是很顯而易見的,當咱們在進行實際開發時對代碼進行了更改咱們須要環境當即作出響應。spa
在發佈模式下,MVC的視圖解析有利於性能的優化,當一個視圖在發佈模式下被正確解析了,此時會緩存該搜索的結果,當再次遇到以該視圖命名的引用時不須要在另一個文件系統中進行搜索。.net
經過上述描述咱們可以理解若是模式是在發佈模式下在第一次被解析後,其結果是可以被緩存的,雖然在視圖引擎中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系列講解。