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 https://stackoverflow.com/a/46627920/3645638 and here https://stackoverflow.com/a/47011823/3645638.
如果您想将 ASP.NET Core 框架与其他框架进行比较,这是一个很好的视觉效果。正如您所看到的,ASP.NET Core 具有出色的结果,并且是 C# 的领先框架。
在上面的代码块中,我注意到缺少app.UseMvc()
。如果您确实需要它,我已经在这个答案中做了关于获得更好延迟的非常详细的答案:AddMvc() 和 AddMvcCore() 有什么区别? https://stackoverflow.com/a/42365276/3645638
.NET 核心运行时 (CoreRT)
如果您仍然需要更多性能,我建议您查看.Net 核心运行时 (CoreRT) https://github.com/dotnet/corert.
请注意,在撰写本文时,可能需要更详细地审查此选项,然后再针对生产系统进行此操作。
“CoreRT 带来了本机编译的大部分性能和所有部署优势,同时保留了使用您最喜欢的 .NET 编程语言进行编写的能力。”
CoreRT 提供了对许多应用程序至关重要的巨大优势。
- 本机编译器生成一个单个文件,包括应用程序、托管依赖项和 CoreRT。
- 本机编译的应用程序启动速度更快,因为它们执行已编译的代码。它们不需要在运行时生成机器代码,也不需要加载 JIT 编译器。
- 本机编译的应用程序可以使用优化编译器,从而通过更高质量的代码实现更快的吞吐量(C++ 编译器优化)。 LLILLC 和 IL to 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://github.com/redhat-developer/kestrel-linux-transport
Source: https://developers.redhat.com/blog/2018/07/24/improv-net-core-kestrel-performance-linux/ https://developers.redhat.com/blog/2018/07/24/improv-net-core-kestrel-performance-linux/