【发布时间】:2021-09-07 14:50:57
【问题描述】:
我有一个使用 .NET Core 3.1 的 protobuf-net.gRPC 运行的 gRPC 服务器。它在后台使用 ASP.NET Core 框架和 Kestrel 来运行 HTTP 服务器。我注意到,与在同一端点上的后续调用相比,第一次在此服务器上命中的 gRPC 端点在 ASP NET Core 中间件中花费的时间要多得多。
Time taken from
Microsoft.AspNetCore.Routing.EndpointMiddleware[ExecutedEndPoint] : Executing endpoint 'gRPC - /grpc.....'
Until hitting the actual endpoint function in my gRPC server
第一次花费的时间相当长,大约 30-40 Ma,而随后对同一端点的调用大约是 1-2 ms。
这是因为 JIT 编译器是从 IL->Native 代码编译的吗?如果是这样,除了强制调用端点等显而易见的方法之外,还有其他方法可以解决这个首次性能问题吗?
问候
【问题讨论】:
-
第一个请求比后续请求花费更长的时间对我来说并不奇怪。我猜这只是 gRPC 服务器端堆栈的热身。此外,这可能不是 gRPC 特定的事情,当第一次使用 ASP.NET 核心中的新 HTTP/2 处理程序时,它的行为可能类似。我在这里找到了类似的讨论:github.com/dotnet/aspnetcore/issues/17985(这可能会给你你需要的答案)。
标签: c# asp.net-core protobuf-net netcoreapp3.1 protobuf-net.grpc