使用 ASP.NET Core / Kestrel 当然可以实现低延迟。
这是一个小型网络应用程序来演示这一点......
using System.Net;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
public static void Main(string[] args)
{
IWebHost host = new WebHostBuilder()
.UseKestrel()
.Configure(app =>
{
// notice how we don't have app.UseMvc()?
app.Map("/hello", SayHello); // <-- ex: "http://localhost/hello"
})
.Build();
host.Run();
}
private static void SayHello(IApplicationBuilder app)
{
app.Run(async context =>
{
// implement your own response
await context.Response.WriteAsync("Hello World!");
});
}
我在here和here之前已经多次回答过这种类似的问题。
如果您希望将 ASP.NET Core 框架与其他框架进行比较,这是一个很棒的可视化 https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext。如您所见,ASP.NET Core 成绩斐然,是领先的 C# 框架。
在上面的代码块中,我注意到缺少app.UseMvc()。如果你确实需要它,我已经在这个答案中做了一个关于获得更好延迟的非常详细的答案:What is the difference between AddMvc() and AddMvcCore()?
.NET Core 运行时 (CoreRT)
如果您仍然需要更高的性能,我建议您查看.Net Core Runtime (CoreRT)。
请注意,在撰写本文时,可能需要更详细地审查此选项,然后再将其用于生产系统。
“CoreRT 带来了本机编译的大部分性能和所有部署优势,同时保留了您使用自己喜欢的 .NET 编程语言进行编写的能力。”
CoreRT 提供了对许多应用至关重要的巨大优势。
- 本机编译器生成一个单一文件,包括应用程序、托管依赖项和 CoreRT。
- 本机编译的应用程序启动速度更快,因为它们执行已编译的代码。他们不需要在运行时生成机器代码,也不需要加载 JIT 编译器。
- 本机编译的应用程序可以使用优化编译器,从而提高更高质量代码的吞吐量(C++ 编译器优化)。 LLILLC 和 IL 到 CPP 编译器都依赖于优化编译器。
这些优势为 .NET 开发人员开辟了一些新场景
- 从一台机器上复制一个可执行文件并在另一台(同类)上运行,而无需安装 .NET 运行时。
- 创建并运行包含单个可执行文件的 docker 映像(例如,除了 Ubuntu 14.04 之外的一个文件)。
Linux 特定优化
有一个很好的库可以尝试处理非常特殊的情况。特别是对于 Linux(但此代码对于其他操作系统是安全的)。此优化背后的原理是将libuv 传输库(ASP.NET Core 使用)替换为另一种特定于 Linux 的优化。
它直接使用内核原语来实现传输 API。这减少了堆分配对象的数量(例如uv_buf_t、SocketAsyncEventArgs),这意味着 GC 压力更小。在 xplat API 之上构建的实现将汇集对象来实现这一点。
using RedHat.AspNetCore.Server.Kestrel.Transport.Linux; // <--- note this !
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseLinuxTransport() // <--- and note this !!!
.UseStartup()
.Build();
// note: It's safe to call UseLinuxTransport on non-Linux platforms, it will no-op
您可以在 GitHub 上查看该中间件的存储库 https://github.com/redhat-developer/kestrel-linux-transport
来源:https://developers.redhat.com/blog/2018/07/24/improv-net-core-kestrel-performance-linux/