【译】ASP.NET Core 6 中的性能改进 (5)

dotnet/aspnetcore#31466 使用 .NET 6 中引入的新 CancellationTokenSource.TryReset() 方法来重用 CancellationTokenSource,如果连接在没有被取消的情况下关闭。以下数字是通过对具有 125 个连接的 Kestrel 运行轰炸机收集的,它运行了约 100,000 个请求。

Branch Type Allocations Bytes
Before   CancellationTokenSource   98,314 4,719,072  
After   CancellationTokenSource   125 6,000  

dotnet/aspnetcore#31528 和 dotnet/aspnetcore#34075 分别对 HTTPS 握手和 HTTP3 流重用 CancellationTokenSource 进行了类似的更改。

dotnet/aspnetcore#316600 通过为整个流重用分配的 StreamItem 对象而不是为每个流项分配一个对象,改进了 SignalR 中流的性能。并且 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); } Method Mean Ratio Allocated
Use   15.832 ns   1.00   96 B  
UseNew   2.592 ns   0.16    
总结

希望您喜欢阅读 ASP.NET Core 6.0 中的一些改进!我鼓励您查看 .NET 6 博客文章中的性能改进,它超越了运行时的性能。

原文链接

Performance improvements in ASP.NET Core 6

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzfdg.html