你如何提高你的ASP.NET MVC應用程序性能?如何提高ASP.NET MVC應用程序的性能?
回答
的改善可能來源的彙總列表低於:
一般
- 製作使用探查,發現在你的應用程序的內存泄漏和性能問題。我個人建議dotTrace
- 在發佈模式下運行您的站點,而不是在調試模式下,在生產環境中以及性能分析過程中。發佈模式要快得多。調試模式可以隱藏自己的代碼中的性能問題。
緩存
- 使用
CompiledQuery.Compile()
遞歸避免 重新編譯查詢的 表達式中使用OutputCacheAttribute
節省不必要和行動 執行 - 緩存不傾向對變化 內容
- U SE餅乾的頻繁訪問的非敏感信息
- 利用ETags和過期 - 編寫自定義
ActionResult
方法,如果有必要 - 考慮使用
RouteName
來組織你的路由,然後用它來生成 你的鏈接,並儘量不要使用基於表達樹的ActionLink方法。 - 考慮實施路由解析緩存策略
- 把重複的代碼你
PartialViews
內,避免使其XXXX次:如果你 最終調用相同部分的300倍,在同樣的觀點,有可能是一些 錯誤接着就,隨即。 Explanation And Benchmarks
路由
使用
Url.RouteUrl("User", new { username = "joeuser" })
指定路線。ASP.NET MVC Perfomance by Rudi Benkovic緩存航線使用該助手
UrlHelperCached
ASP.NET MVC Perfomance by Rudi Benkovic
安全
- 使用表單身份驗證解決,請您經常訪問的敏感數據在 身份驗證票證
DAL
- 通過LINQ rely on IQueryable
- Leverage the Repository pattern
- 簡介您的疑問,即Uber Profiler
- 考慮二級緩存爲您查詢並添加它們的範圍和超時即NHibernate Second Cache 訪問數據時
負載均衡
使用Asynchronous Controllers實現依賴於外部資源的處理動作。
客戶端
- 優化您的客戶端,使用工具如YSlow對於 提高性能的建議
- 使用AJAX更新UI的組件,儘可能避免整個頁面更新。
- 考慮實施pub-sub架構 - 即。 Comet-針對內容傳輸,基於超時重新加載 。
- 如果可能的話,將圖表和圖表生成邏輯移動到客戶端。圖表生成 是一個昂貴的活動。將服務器從 不必要的負擔延遲到客戶端,並且允許您在本地使用圖形,而無需發出新的 請求(即Flex圖表,jqbargraph,MoreJqueryCharts)。
- 使用CDN對腳本和媒體內容,以提高在客戶端負載(即Google CDN)
- 縮減大小 - 爲了提高你的腳本大小
- 保持餅乾體積小,因爲cookie被髮送到你的JavaScript - Compile每個請求上的服務器。
- 儘可能考慮使用DNS and Link Prefetching。
全局配置
如果使用剃刀,添加以下代碼在你的global.asax.cs,默認情況下,Asp.Net MVC呈現與一個aspx發動機和剃刀引擎。這隻使用RazorViewEngine。
ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());
在你的web.config添加的gzip(HTTP壓縮)和靜態緩存(圖片,CSS,...)
<system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>
- 刪除未使用的HTTP模塊
- 刷新你的HTML作爲一旦它生成(在你的web.config中),並禁用視圖狀態,如果你不使用它
<pages buffer="true" enableViewState="false">
不是一個驚天動地的優化,但我想我會把它扔到那裏 - Use CDN's for jQuery, etc.。
ScottGu自己引用:Microsoft Ajax CDN使您能夠顯着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗體和ASP.NET MVC應用程序的性能。該服務免費提供,不需要任何註冊,可用於商業和非商業用途。
我們甚至在使用jQuery的Moss的web部件中使用CDN。
的基本建議是遵循REST principles及以下幾點捆綁一些校長到ASP.NET MVC框架:
- 讓你的控制器stateless - 這更是一個「網絡的性能 /可擴展性「的建議(而不是微觀/機器級別的性能)以及可能會影響您應用程序未來的主要設計決策 - 尤其是在它變得流行或者您需要某種容錯功能的情況下。
- 不要使用會話
- 不要使用TempData的 - 它使用會話
- 不要試圖「緩存」一切「過早」。
- 使用Forms Authentication
- 讓您經常訪問的敏感數據在身份驗證票證
- 爲經常訪問的非敏感信息
- 使用Cookie在網絡上讓你resources cachable
- Utilize ETags
- 使用截止
- 如果有必要編寫自定義的ActionResult類
- 利用reverse proxies
- 編譯你的JavaScript。 There is Closure compiler library也可以這樣做(當然也可以使用there are others, just search for 'JavaScript compiler')
- 使用CDN(內容傳送網絡) - 尤其是對於大型媒體文件等。
- 考慮不同類型的存儲你的數據,例如,文件,鍵/值存儲,等等 - 不僅是SQL Server的
- 最後但並非最不重要的,測試您的網站性能
Code Climber和this blog entry提供了提高應用程序性能的詳細方法。
編譯查詢會提高應用程序的性能,但它與ASP.NET MVC沒有任何共同之處。它會加速每個數據庫應用程序,所以它不是真的關於MVC。
通過LINQ訪問數據時依靠的IQueryable ...
Why use AsQueryable() instead of List()?
...和leverge良好的Repository模式:
Loading Subrecords in the Repository Pattern
這將優化數據訪問,以確保只有需要的數據被加載並且只在需要時才加載。
另外,如果您使用NHibernate,則可以打開併爲查詢設置第二級緩存並添加到查詢範圍和超時。並且有EF,L2S和NHibernate的踢屁股分析器 - http://hibernatingrhinos.com/products/UberProf。這將有助於調整您的查詢。
Ayende最近的博客上講述EF探查如何幫助他調整一個樣本MVC應用程序:http://ayende.com/Blog/archive/2010/05/17/analyzing-the-mvc-music-store-data-access.aspx – 2010-05-19 21:40:08
除了在服務器端優化您的應用程序的所有優秀信息,我會說你應該看看YSlow。這是提高客戶端網站性能的極好資源。
這適用於所有網站,不僅僅是ASP.NET MVC。
一件非常容易的事就是在訪問頁面所需的數據時進行異步思考。無論是從Web服務,文件,數據庫還是其他內容讀取,都儘可能使用異步模型。雖然它不一定能幫助任何一個頁面加快速度,但它會幫助您的服務器更好地執行整體。
這看起來很明顯,但在發佈模式下運行您的站點,而不是在調試模式下,在生產環境中以及性能分析過程中。發佈模式是多了更快。調試模式可以隱藏自己的代碼中的性能問題。
我也將增加:
使用精靈:精靈是減少請求一個偉大的事情。您將所有圖像合併爲一個圖像,然後使用CSS獲得精靈 的一部分。微軟提供了一個很好的庫: Sprite and Image Optimization Preview 4。
緩存服務器對象:如果你有一些參考表或數據將很少發生變化,您可以緩存他們到內存,而不是每次查詢數據庫。
使用ADO.NET,而不是實體框架:
EF4 or EF5
是偉大的,以縮短開發時間,但是這將是痛苦的優化。 優化stored procedure比實體 框架更簡單。所以你應該儘可能地使用存儲過程。 Dapper提供了一種簡單的方式來查詢和映射SQL,其性能非常好 。緩存頁或部分頁面:MVC根據一些參數提供了一些簡單的緩存頁面過濾器,所以使用它。
減少數據庫調用:您可以創建一個返回多個對象的唯一數據庫請求。檢查Dapper網站。
總是有一個乾淨的架構:即使在一個小項目,也有一個乾淨的n層架構。它會幫助你保持你的代碼清潔,如果需要的話,它會更容易優化。
你可以看看這個模板「Neos-SDI MVC Template」 ,這將創造一個乾淨的架構,你有很多的默認 性能改進(檢查MvcTemplate 網站)。
你認爲運行一個返回更多結果集的存儲過程更好,然後以異步模式運行更多的存儲過程會更好嗎? – Muflix 2016-08-09 16:57:09
1:獲取計時。在你知道經濟放緩之前,這個問題太廣泛了,無法回答。我正在做的一個項目有這個確切的問題;沒有記錄甚至不知道某些事情需要多長時間;我們只能猜測應用程序的緩慢部分,直到我們爲項目添加時間。
2:如果你有順序操作,不要害怕輕微多線程。特別是如果涉及阻塞操作。 PLINQ是你的朋友。
3:預生成你的MVC視圖時發佈...這將與一些「第一頁命中」
4的幫助:一些人對速度的存儲過程/ ADO的優勢。其他人則認爲EF的發展速度以及更明確的層級和目的。當SQL和使用Sprocs/Views進行數據檢索和存儲的解決方法時,我已經看到了非常慢的設計。另外,你的測試難度也會增加。我們目前從ADO轉換到EF的代碼庫並沒有比舊的手動模型更糟糕(在某些情況下更好)。
5:這就是說,考慮應用熱身。我們所做的一部分工作是幫助消除大部分EF性能問題,其中之一就是增加一種特殊的熱身方法。它不會預編譯任何查詢或任何內容,但它有助於大部分元數據加載/生成。在處理Code First模型時,這可能更爲重要。
6:正如其他人所說,如果可能,請勿使用會話狀態或ViewState。它們不一定是開發人員想到的性能優化,但是一旦開始編寫更復雜的Web應用程序,就需要響應能力。會話狀態排除了這一點。想象一下長時間運行的查詢。你決定打開一個新窗口,嘗試一個不太複雜的窗口。那麼,你可能已經等待會話狀態,因爲服務器將等到第一個請求完成,然後再轉到該會話的下一個請求。 7:最小化到數據庫的往返行程。保存您經常使用但不會真實改變到.Net緩存的內容。嘗試在可能的情況下批量插入/更新。
7.1:避免在您的Razor視圖中的數據訪問代碼沒有一個很好的理由。如果我沒有看到它,我不會說這個。他們已經在將模型放在一起時訪問他們的數據,爲什麼他們不把它們包括在模型中?
在你鬧着要優化客戶端,不要忘了數據庫層。我們有一個應用程序從5秒開始,在一夜之間加載到50秒。
在檢查中,我們犯了一大堆的架構更改。一旦我們刷新統計數據,它突然變得像以前一樣敏感。
- 實現Gzip已。
- 對部分視圖使用異步渲染。
- 最小化數據庫命中。
- 使用已編譯的查詢。
- 運行一個分析器並找出不必要的命中。優化所有超過1秒鐘的存儲過程以返回響應。
- 使用緩存。
- 使用bundling minification優化。
- 使用HTML 5實用程序(如會話高速緩存和本地存儲)來實現只讀內容。
以下是要做的事情
- 內核模式緩存
- 管道模式
- 刪除未使用的模塊
- runAllManagedModulesForAllRequests
- wwwroot中不要寫
- 刪除未使用的視圖引擎和語言
使用捆綁和縮小也有助於提高性能。它基本上減少了頁面加載時間。
只想添加我的2美分。在MVC應用程序中優化URL路徑生成的最有效方法是......根本不生成它們。
我們大多數人或多或少知道網址是如何在我們的應用程序產生的,無論如何,單純用靜態Url.Content("~/Blahblah")
代替Url.Action()
或Url.RouteUrl()
在可能情況下,通過近20倍,甚至更擊敗所有其他方法。
PS。我已經運行了幾千次迭代的基準,並且如果感興趣,發佈結果on my blog。
- 1. 如何提高ASP.NET MVC Web應用程序的性能?
- 2. 提高ASP.NET應用程序的性能
- 3. 如何提高asp.net應用程序的性能?
- 4. 如何提高ASP.net應用程序的性能
- 5. 提高Windows應用程序的性能
- 6. 提高Web應用程序的性能
- 7. Asp.net MVC實時應用程序性能
- 8. 線程 - 如何提高應用程序的性能
- 9. 提高圖像應用程序性能
- 10. 提高android應用程序性能
- 11. 提高應用程序性能
- 12. FastCGI將如何提高我的PHP應用程序的性能?
- 13. 如何提高我的Web應用程序的性能?
- 14. 如何提高我的Ionic3 Anguar4應用程序的性能?
- 15. 如何分析ASP.NET MVC應用程序中的請求性能?
- 16. 提高ASP.NET MVC啓動性能
- 17. 如何提高Web應用程序的圖像加載性能?
- 18. 如何提高應用程序的性能
- 19. 代表如何提高應用程序的性能?
- 20. 如何提高我的iOS應用程序性能
- 21. 如何提高單頁面應用程序的性能?
- 22. 如何提高Sencha Touch 2.x應用程序的性能
- 23. 如何提高VS11 Metro應用程序的性能?
- 24. 如何提高Flex應用程序的性能?
- 25. 如何提高SQLite + UITableView應用程序的性能?
- 26. 如何提高Web應用程序的性能?
- 27. ASP.NET - 提高性能
- 28. 如何提高ASP.NET MVC WEB API的性能?
- 29. ASP.Net應用程序的高可用性
- 30. Asp.Net應用程序性能
等你意味着我失去了表現,當我例如有一個視圖通過IList激怒並顯示結果集,併爲每個列表項調用Render.PartialView(「Row」,item)?我輸了多少?或者我怎麼測量性能增益? – 2010-02-12 15:03:33
@SDReyes - ** pub-sub架構**的含義是什麼? – xameeramir 2015-11-26 06:18:33
這很酷。 Uber Profiler鏈接已經死了。這應該與其中一個ORM特定的分析器鏈接嗎? – shanabus 2016-12-07 19:57:02