這篇文章的主要內容來源于.NET檔案,此處翻譯前4條內容,其他內容會陸續貼出來
- 盡量使用快取
- 了解”熱代碼路徑”
- 避免使用阻塞呼叫
- 回傳值使用IEnumerable<T> 或 IAsyncEnumerable<T>
盡量使用快取
詳情請查看:ASP.NET Core 中的回應快取.
了解”熱代碼路徑”
”熱代碼”定義為訪問頻繁并且耗時較長的代碼,”熱代碼”對性能影響很明細,
避免使用阻塞呼叫
ASP.NET Core 程式應該被設計成同時處理多個請求,異步API使用一個小執行緒池可以處理上千個并發請求,而不會阻塞,這樣請求執行緒可以去處理其他請求,而不是等待一個長時同步任務完成,
ASP.NET Core 程式的一個常見的性能問題是,阻塞了本該異步執行的呼叫,很多同步呼叫會導致執行緒池饑餓,增大相應時間,
不要像下面這樣做:
- 通過 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>,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/76636.html
標籤:.NET Core
