2010-02-11 173 views

回答

278

的改善可能來源的彙總列表低於:

一般

  • 製作使用探查,發現在你的應用程序的內存泄漏和性能問題。我個人建議dotTrace
  • 在發佈模式下運行您的站點,而不是在調試模式下,在生產環境中以及性能分析過程中。發佈模式要快得多。調試模式可以隱藏自己的代碼中的性能問題。

緩存

  • 使用CompiledQuery.Compile() 遞歸避免 重新編譯查詢的 表達式中使用OutputCacheAttribute 節省不必要和行動 執行
  • 緩存不傾向對變化 內容
  • U SE餅乾的頻繁訪問的非敏感信息
  • 利用ETags和過期 - 編寫自定義ActionResult方法,如果有必要
  • 考慮使用RouteName來組織你的路由,然後用它來生成 你的鏈接,並儘量不要使用基於表達樹的ActionLink方法。
  • 考慮實施路由解析緩存策略
  • 把重複的代碼你PartialViews內,避免使其XXXX次:如果你 最終調用相同部分的300倍,在同樣的觀點,有可能是一些 錯誤接着就,隨即。 Explanation And Benchmarks

路由

安全

  • 使用表單身份驗證解決,請您經常訪問的敏感數據在 身份驗證票證

DAL

負載均衡

  • 利用反向代理,以在您的應用程序實例傳播客戶端負載。 (堆棧溢出使用HAProxyMSDN)。

  • 使用Asynchronous Controllers實現依賴於外部資源的處理動作。

客戶端

  • 優化您的客戶端,使用工具如YSlow對於 提高性能的建議
  • 使用AJAX更新UI的組件,儘可能避免整個頁面更新。
  • 考慮實施pub-sub架構 - 即。 Comet-針對內容傳輸,基於超時重新加載 。
  • 如果可能的話,將圖表和圖表生成邏輯移動到客戶端。圖表生成 是一個昂貴的活動。將服務器從 不必要的負擔延遲到客戶端,並且允許您在本地使用圖形,而無需發出新的 請求(即Flex圖表,jqbargraphMoreJqueryCharts)。
  • 使用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">
+6

等你意味着我失去了表現,當我例如有一個視圖通過IList激怒並顯示結果集,併爲每個列表項調用Render.PartialView(「Row」,item)?我輸了多少?或者我怎麼測量性能增益? – 2010-02-12 15:03:33

+0

@SDReyes - ** pub-sub架構**的含義是什麼? – xameeramir 2015-11-26 06:18:33

+0

這很酷。 Uber Profiler鏈接已經死了。這應該與其中一個ORM特定的分析器鏈接嗎? – shanabus 2016-12-07 19:57:02

6

不是一個驚天動地的優化,但我想我會把它扔到那裏 - Use CDN's for jQuery, etc.

ScottGu自己引用:Microsoft Ajax CDN使您能夠顯着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗體和ASP.NET MVC應用程序的性能。該服務免費提供,不需要任何註冊,可用於商業和非商業用途。

我們甚至在使用jQuery的Moss的web部件中使用CDN。

10

的基本建議是遵循REST principles及以下幾點捆綁一些校長到ASP.NET MVC框架:

  1. 讓你的控制器stateless - 這更是一個「網絡的性能 /可擴展性「的建議(而不是微觀/機器級別的性能)以及可能會影響您應用程序未來的主要設計決策 - 尤其是在它變得流行或者您需要某種容錯功能的情況下。
    • 不要使用會話
    • 不要使用TempData的 - 它使用會話
    • 不要試圖「緩存」一切「過早」。
  2. 使用Forms Authentication
    • 讓您經常訪問的敏感數據在身份驗證票證
  3. 爲經常訪問的非敏感信息
  4. 使用Cookie在網絡上讓你resources cachable
  5. 編譯你的JavaScript。 There is Closure compiler library也可以這樣做(當然也可以使用there are others, just search for 'JavaScript compiler'
  6. 使用CDN(內容傳送網絡) - 尤其是對於大型媒體文件等。
  7. 考慮不同類型的存儲你的數據,例如,文件,鍵/值存儲,等等 - 不僅是SQL Server的
  8. 最後但並非最不重要的,測試您的網站性能
10

Code Climberthis blog entry提供了提高應用程序性能的詳細方法。

編譯查詢會提高應用程序的性能,但它與ASP.NET MVC沒有任何共同之處。它會加速每個數據庫應用程序,所以它不是真的關於MVC。

6

另外,如果您使用NHibernate,則可以打開併爲查詢設置第二級緩存並添加到查詢範圍和超時。並且有EF,L2S和NHibernate的踢屁股分析器 - http://hibernatingrhinos.com/products/UberProf。這將有助於調整您的查詢。

+0

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

4

除了在服務器端優化您的應用程序的所有優秀信息,我會說你應該看看YSlow。這是提高客戶端網站性能的極好資源。

這適用於所有網站,不僅僅是ASP.NET MVC。

3

一件非常容易的事就是在訪問頁面所需的數據時進行異步思考。無論是從Web服務,文件,數據庫還是其他內容讀取,都儘可能使用異步模型。雖然它不一定能幫助任何一個頁面加快速度,但它會幫助您的服務器更好地執行整體。

7

這看起來很明顯,但在發佈模式下運行您的站點,而不是在調試模式下,在生產環境中以及性能分析過程中。發佈模式是多了更快。調試模式可以隱藏自己的代碼中的性能問題。

3

我也將增加:

  1. 使用精靈:精靈是減少請求一個偉大的事情。您將所有圖像合併爲一個圖像,然後使用CSS獲得精靈 的一部分。微軟提供了一個很好的庫: Sprite and Image Optimization Preview 4

  2. 緩存服務器對象:如果你有一些參考表或數據將很少發生變化,您可以緩存他們到內存,而不是每次查詢數據庫。

  3. 使用ADO.NET,而不是實體框架EF4 or EF5是偉大的,以縮短開發時間,但是這將是痛苦的優化。 優化stored procedure比實體 框架更簡單。所以你應該儘可能地使用存儲過程。 Dapper提供了一種簡單的方式來查詢和映射SQL,其性能非常好 。

  4. 緩存頁或部分頁面:MVC根據一些參數提供了一些簡單的緩存頁面過濾器,所以使用它。

  5. 減少數據庫調用:您可以創建一個返回多個對象的唯一數據庫請求。檢查Dapper網站。

  6. 總是有一個乾淨的架構:即使在一個小項目,也有一個乾淨的n層架構。它會幫助你保持你的代碼清潔,如果需要的話,它會更容易優化。

  7. 你可以看看這個模板「Neos-SDI MVC Template」 ,這將創造一個乾淨的架構,你有很多的默認 性能改進(檢查MvcTemplate 網站)。

+0

你認爲運行一個返回更多結果集的存儲過程更好,然後以異步模式運行更多的存儲過程會更好嗎? – Muflix 2016-08-09 16:57:09

2

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視圖中的數據訪問代碼沒有一個很好的理由。如果我沒有看到它,我不會說這個。他們已經在將模型放在一起時訪問他們的數據,爲什麼他們不把它們包括在模型中?

1

在你鬧着要優化客戶端,不要忘了數據庫層。我們有一個應用程序從5秒開始,在一夜之間加載到50秒。

在檢查中,我們犯了一大堆的架構更改。一旦我們刷新統計數據,它突然變得像以前一樣敏感。

1
  1. 實現Gzip已。
  2. 對部分視圖使用異步渲染。
  3. 最小化數據庫命中。
  4. 使用已編譯的查詢。
  5. 運行一個分析器並找出不必要的命中。優化所有超過1秒鐘的存儲過程以返回響應。
  6. 使用緩存。
  7. 使用bundling minification優化。
  8. 使用HTML 5實用程序(如會話高速緩存和本地存儲)來實現只讀內容。
0

以下是要做的事情

  1. 內核模式緩存
  2. 管道模式
  3. 刪除未使用的模塊
  4. runAllManagedModulesForAllRequests
  5. wwwroot中不要寫
  6. 刪除未使用的視圖引擎和語言
0

使用捆綁和縮小也有助於提高性能。它基本上減少了頁面加載時間。

2

只想添加我的2美分。在MVC應用程序中優化URL路徑生成的最有效方法是......根本不生成它們。

我們大多數人或多或少知道網址是如何在我們的應用程序產生的,無論如何,單純用靜態Url.Content("~/Blahblah")代替Url.Action()Url.RouteUrl()在可能情況下,通過近20倍,甚至更擊敗所有其他方法。

PS。我已經運行了幾千次迭代的基準,並且如果感興趣,發佈結果on my blog