如何提高ASP.Net Core应用程序的性能

ASP.Net Core是对ASP.Net框架的快速,轻量级,开源,跨平台重写,可在Windows,Linux甚至Mac OS X上运行。速度是ASP.Net Core的主要功能之一,这意味着ASP.Net Core框架已针对提高性能进行了优化。 但是,可以采用一些最佳实践和策略来提高利用.Net Core运行时的应用程序的性能。

提高应用程序性能的本质是确保您构建消耗最少资源来产生所需输出的应用程序。 本文讨论了可以采用的最佳实践,以改善ASP.Net Core应用程序的性能。

[ 小心! 每个开发人员都应避免的8个职业陷阱 。 • 要成为一名真正的软件开发人员,必须阅读7本书 。 • 即使是经验丰富的开发人员,也会犯15个菜鸟错误 。 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

内联方法

内联方法提高了性能,因为它节省了跳转,传递参数以及保存和恢复寄存器的成本。 请注意,JIT(即时)编译器不会内联包含throw语句的方法。 要解决此问题,您可以利用静态帮助器方法来包含throw语句。

减少虚拟通话

调用虚拟成员的速度较慢,因为虚拟调用需要间接调用。 脱虚拟化是JIT编译器的功能,并且脱虚拟化方法可以成为内联的候选对象。 当知道对象的类型时, RyuJIT (用于.Net Core的JIT)可以取消非密封方法调用的虚拟化。 为避免虚拟呼叫,您可以遵循以下准则:

  • 默认将类或方法标记为已密封
  • 将覆盖的方法也标记为密封
  • 使用具体类型代替接口

池HTTP连接

尽管HttpClient实现了IDisposable接口,但是建议重用HttpClient实例。 原因是HttpClient即使在关闭套接字后,仍将套接字保持打开状态并在短时间内处于等待状态。 因此,如果您每次需要HttpClient时尝试创建新的HttpClient实例,则可能会耗尽可用的套接字。

考虑到这一点,在ASP.Net Core 2.1中引入了HttpClientFactory来缓冲HTTP连接。 通过池化连接,HttpClientFactory可以优化性能,可伸缩性和可靠性。 因此,避免直接创建和销毁HttpClient实例,并使用HttpCLientFactory检索HttpClient实例。

减少分配

诸如System.ValueTuple和Span 之类的新类型的引入为提高性能提供了新思路。 当您尝试从方法返回多个值时,请利用System.ValueTuple减少分配。 并利用Span 避免数组分配和数据复制。

主动缓存

缓存是提高性能的最佳方法之一。 您应该积极地缓存并缓存相对过时的所有数据。 ASP.Net Core提供了对响应缓存中间件的支持,您可以使用它来实现响应缓存。 响应缓存是输出缓存的增强形式。 它是指使用HTTP响应对象中与缓存相关的标头缓存Web服务器响应的能力。 通过阅读有关在ASP.Net Core中使用响应缓存中间件的文章,可以了解更多信息。

您还可以利用NCache之类的分布式缓存来缓存相对陈旧的数据。 NCache是​​一种非常快速且可扩展的内存分布式缓存,易于配置和使用。 您可以阅读有关在ASP.Net Core中使用NCache的文章。

启用压缩

减少响应的大小可以提高应用程序的性能,因为在服务器和客户端之间传输的数据更少。 您可以利用ASP.Net Core中的响应压缩来缩小响应并减少带宽需求。 ASP.Net Core中的响应压缩可用作中间件组件。 以下代码段显示了如何将响应压缩中间件添加到请求处理管道。

    public void ConfigureServices(IServiceCollection services) 
    { 
        services.AddResponseCompression(); 
        services.Configure
        (options => 
        { 
            options.Level = CompressionLevel.Fastest; 
        }); 
    }

您还可以利用ASP.Net Core的内置支持来捆绑和缩小客户端文件或资产,以提高性能。

有关更多信息,您可以阅读有关在ASP.Net Core中使用响应压缩的文章。

减少HTTP请求

每次Web浏览器打开与服务器的连接时,都会有TCP / IP开销。 一个很棒的优化技巧是减少HTTP请求的数量。 您还可以利用HTTP / 2的优势-HTTP的这一新版本引入了一些有用的优化。 您应该避免客户端重定向,并缓存您的网页以减少与Web服务器建立的连接数。 如果缩小文件然后将它们捆绑在一起,则数据将加载得更快,并减少呈现网页所需的HTTP请求的数量。

避免阻止通话

您应该避免阻塞呼叫,因为它们可能会导致性能下降。 如果您有太多的同步阻塞调用,则可能会遇到线程饥饿问题。 您不应使用Task.Wait或Task.Result阻止异步执行。 您应该使热代码路径异步-例如,应该异步调用数据访问和长时间运行的操作。 您可以利用诸如PerfView之类的性能分析器来检查线程行为。 有关更多信息,您可以阅读有关理解.Net CLR线程池的文章 。

最小化大对象分配

.Net Core垃圾回收器擅长释放托管堆中对象占用的内存。 但是,释放对象会占用CPU时间,尤其是当对象是大对象(85 KB或更大)时。 垃圾回收发生在四代中,分别是第0代,第1代和第2代以及大对象堆(LOH)。 垃圾收集器在低代中比在高代中更频繁地工作。

大件垃圾的收集很昂贵。 为了最大程度地减少大对象分配,应使用ArrayPool 来利用池缓冲区,并缓存经常使用的大对象。 您不应该在公共代码路径上获得锁,并且避免在热代码路径上分配过多的短期对象。

仅在必要时使用例外

应当指出,引发和捕获异常非常昂贵。 因此,仅在需要时才应使用异常。 您应尽量减少在应用程序中使用异常,并避免使用异常处理来控制程序流。 您可以阅读有关异常处理最佳实践的文章,以了解更多信息。

优化数据访问

请记住,数据访问是应用程序中最慢的操作之一。 您应该异步调用所有数据访问API。 您应最大程度地减少与数据库的往返次数,并仅检索所需的数据。 避免对集合使用投影查询。

如果您使用Entity Framework Core进行数据访问,请遵循Entity Framework Core中推荐的指南和做法。 如果您正在读取应用程序不会修改的数据,则应利用Entity Framework Core中的无跟踪查询。 请参阅我关于Entity Framework最佳做法的文章,以了解如何提高Entity Framework的性能。

虽然Web应用程序性能调整很复杂,但是可以利用一些通用技术和推荐做法来改善ASP.Net Core应用程序的性能。 您还可以利用某些工具,例如MiniProfiler , Glimpse , Application Insights和Stackify Retrace来衡量应用程序性能,检测性能瓶颈并确定适当的补救措施。

From: https://www.infoworld.com/article/3387276/how-to-improve-the-performance-of-aspnet-core-applications.html

你可能感兴趣的:(操作系统,网络,数据库)