每个人都知道异步可以为您提供“更好的吞吐量”、“可扩展性”以及在资源消耗方面更高效。在进行下面的实验之前,我也想到了这种(简单的)方式。它基本上告诉我们,如果我们考虑异步代码的所有开销并将其与正确配置的同步代码进行比较,它几乎不会产生性能/吞吐量/资源消耗优势。
问题:与正确配置线程池的同步代码相比,异步代码实际上执行得更好吗?可能是我的性能测试以某种戏剧性的方式存在缺陷?
测试设置:两个 ASP.NET Web API 方法,JMeter 试图用 200 个线程线程组调用它们(30 秒恢复时间)。
[HttpGet]
[Route("async")]
public async Task<string> AsyncTest()
{
await Task.Delay(_delayMs);
return "ok";
}
[HttpGet]
[Route("sync")]
public string SyncTest()
{
Thread.Sleep(_delayMs);
return "ok";
}
这是响应时间(对数刻度)。请注意,当线程池注入足够多的线程时,同步代码如何变得更快。如果我们事先(通过SetMinThreads)设置线程池,它会从一开始就表现出色async。
你会问资源消耗怎么样。“线程在 CPU 时间调度、上下文切换和 RAM 占用方面的成本很高”。没那么快。线程调度和上下文切换是高效的。就堆栈使用而言,线程不会立即消耗 RAM,而只是保留虚拟地址空间并仅提交实际需要的一小部分。
让我们看看数据怎么说。即使线程数量更多,同步版本的内存占用也更小(映射到物理内存的工作集)。
慕雪6442864
波斯汪
相关分类