ASP.NET Core 性能最佳實踐(一)

這篇文章的主要內容來源於.NET文檔,此處翻譯前4條內容,其餘內容會陸續貼出來git

  1. 儘可能使用緩存
  2. 瞭解」熱代碼路徑」
  3. 避免使用阻塞調用
  4. 返回值使用IEnumerable<T> 或 IAsyncEnumerable<T>

 

儘可能使用緩存github

詳情請查看:ASP.NET Core 中的響應緩存.api

 

瞭解」熱代碼路徑」緩存

」熱代碼」定義爲訪問頻繁而且耗時較長的代碼。」熱代碼」對性能影響很明細。架構

 

避免使用阻塞調用併發

ASP.NET Core 程序應該被設計成同時處理多個請求。異步API使用一個小線程池能夠處理上千個併發請求,而不會阻塞。這樣請求線程能夠去處理其餘請求,而不是等待一個長時同步任務完成。異步

ASP.NET Core 程序的一個常見的性能問題是,阻塞了本該異步執行的調用。不少同步調用會致使線程池飢餓,增大相應時間。async

不要像下面這樣作:性能

  • 經過 Task.Wait 或 Task.Result 阻塞異步執行。
  • 在經常使用代碼上使用鎖(lock)。ASP.NET Core 程序被設計爲並行架構時執行效率最高。
  • 本身定義一個 Task.Run ,而後去await 。因爲ASP.NET Core 程序已是在通用線程池上運行了,調用 Task.Run 是沒有必要的,

應該這樣作:線程

  • 異步調用「熱代碼」。
  • 在訪問數據,I/O,長時操做的時候,若是有異步API就儘可能使用異步API。不要使用Task.Run將同步API異步執行。
  • 使Controller或Razor Page中的Action異步化。將整個調用棧異步化,以便使用 async/await。

性能分析器 PerfView,能夠用來查找頻繁加入線程池的線程。

Microsoft-Windows-DotNETRuntime/ThreadPoolWorkerThread/Start 代表一個線程加入了線程池。

 

返回IEnumerable<T> 仍是 IAsyncEnumerable<T>

若是Action Result返回IEnumerable<T>,那麼序列化器以同步的方式處理集合迭代,這樣阻塞調用可能會致使線程池飢餓,爲避免同步迭代,可在返回迭代以前調用 ToListAsync()。

從ASP.NET Core 3.0開始,IAsyncEnumerable<T>做爲異步枚舉,可取代IEnumerable<T>。

相關文章
相關標籤/搜索