2020-09-18

ASP.NET Core 性能最佳实践(一)

这篇文章的主要内容来源于.NET文档,此处翻译前4条内容,其他内容会陆续贴出来

  1. 尽量使用缓存
  2. 了解”热代码路径”
  3. 避免使用阻塞调用
  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>。

 


原文转载:http://www.shaoqun.com/a/476418.html

DMM:https://www.ikjzd.com/w/2026
启明星软件:https://www.ikjzd.com/w/1436
易佰:https://www.ikjzd.com/w/1482
8月20日起,安克创新股票终止挂牌正式生效!:https://www.ikjzd.com/home/5007
别慌!大神深入解读美国新公布3000亿美元征税清单背后真相!:https://www.ikjzd.com/home/93816
Shopify:2020亿级大卖重点布局的战场:https://www.ikjzd.com/home/114660

这篇文章的主要内容来源于.NET文档,此处翻译前4条内容,其他内容会陆续贴出来尽量使用缓存了解&rdquo;热代码路径&rdquo;避免使用阻塞调用返回值使用IEnumerable<T>或IAsyncEnumerable<T>尽量使用缓存详情请查看:ASP.NETCore中的响应缓存.了解&rdquo;热代码路径&rdquo;&rdq
好卖家:https://www.ikjzd.com/w/776
dmm.adult:https://www.ikjzd.com/w/2026
telegram:https://www.ikjzd.com/w/1734
花几毛钱就能拦截假货跟卖?透明计划就能帮你保住亚马逊的销量和排名! :https://www.ikjzd.com/home/122528
速卖通新店铺怎样增加曝光量,运营技巧分享!:https://www.ikjzd.com/home/108900
向美商务部递交逾130份申请,美企急盼对华为供货!:https://www.ikjzd.com/home/106023

No comments:

Post a Comment