ASP.NET Core 6 的性能改进( 六 )


dotnet/aspnetcore#31660通过在SignalR中为整个流重用分配的StreamItem对象 , 而不是为每个流项分配一个 , 提高了服务器对客户端流的性能 。 而dotnet/aspnetcore#31661将HubCallerClients对象存储在SignalR连接上 , 而不是为每个Hub方法调用分配它 。
@ShreyasJejurkar 的 dotnet/aspnetcore#31506重构了WebSocket握手的内部结构 , 以避免临时List分配 。 @gfoidl 中的 dotnet/aspnetcore#32829重构QueryCollection以减少分配和向量化一些代码 。 @benaadams 的 dotnet/aspnetcore#32234 删除了 HttpRequestHeaders 枚举中未使用的字段 , 该字段通过不再为每个枚举的标头分配字段来提高性能 。
来自 martincostello 的 dotnet/aspnetcore#31333 将 Http.Sys 转换为使用 LoggerMessage.Define , 这是高性能日志记录 API 。 这避免了不必要的值类型装箱、日志格式字符串的解析 , 并且在某些情况下避免了在日志级别未启用时分配字符串或对象 。
dotnet/aspnetcore#31784 添加了一个新的 IApplicationBuilder 。 使用重载来注册中间件 , 以避免在运行中间件时进行一些不必要的按请求分配 。 旧代码如下所示:

app.Use(async (context, next) =>{await next;});新代码如下:
app.Use(async (context, next) =>{await next(context);});下面的基准测试模拟中间件管道 , 而不需要设置服务器来展示改进 。 使用int代替HttpContext用于请求 , 中间件返回一个完成的任务 。
dotnet run -c Release -f net6.0 --runtimes net6.0 --filter *UseMiddlewareBenchmark*static private Func<Func<int, Task>, Func<int, Task>> UseOld(Func<int, Func<Task>, Task> middleware){return next =>{return context =>{Func<Task> simpleNext = => next(context);return middleware(context, simpleNext);};};}static private Func<Func<int, Task>, Func<int, Task>> UseNew(Func<int, Func<int, Task>, Task> middleware){return next => context => middleware(context, next);}Func<int, Task> Middleware = UseOld((c, n) => n)(i => Task.CompletedTask);Func<int, Task> NewMiddleware = UseNew((c, n) => n(c))(i => Task.CompletedTask);[Benchmark(Baseline = true)]public Task Use{return Middleware(10);}[Benchmark]public Task UseNew{return NewMiddleware(10);}
  • benaadams
    https://github.com/benaadams
  • dotnet/aspnetcore#30320
    https://github.com/dotnet/aspnetcore/pull/30320
  • benaadams
    https://github.com/benaadams
  • dotnet/aspnetcore#31322
    https://github.com/dotnet/aspnetcore/pull/31322
  • dotnet/aspnetcore#31519
    https://github.com/dotnet/aspnetcore/pull/31519
  • benaadams
    https://github.com/benaadams
  • 默认接口方法
    https://devblogs.microsoft.com/dotnet/default-implementations-in-interfaces/
  • dotnet/aspnetcore#31466
    https://github.com/dotnet/aspnetcore/pull/31466
  • bombardier
    https://github.com/codesenberg/bombardier
  • dotnet/aspnetcore#31528
    https://github.com/dotnet/aspnetcore/pull/31528
  • dotnet/aspnetcore#34075
    https://github.com/dotnet/aspnetcore/pull/34075
  • dotnet/aspnetcore#31660
    https://github.com/dotnet/aspnetcore/pull/31660
  • 服务器对客户端流
    https://docs.microsoft.com/en-us/aspnet/core/signalr/streaming?view=aspnetcore-5.0#server-to-client-streaming
  • dotnet/aspnetcore#31661
    https://github.com/dotnet/aspnetcore/pull/31661

    特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。