【发布时间】:2020-11-05 05:52:46
【问题描述】:
我正在尝试使用 SQL Server Express 和 EF Core 3.1.3 测量 ASP.NET Core 3.1 中异步与同步的性能,并且有两个功能完全相同,除了一个是异步的,一个是同步的:
[HttpGet("search/description/{searchString}")]
public async Task<ActionResult<IEnumerable<Products>>> SearchForProductsDescription(String searchString) {
return await _context.Products.Where(p => p.Description == searchString).ToListAsync();
}
还有同步版本:
return _context.Products.Where(p => p.Description == searchString).ToList();
我使用 jmeter 作为基准工具,同步函数比异步函数快(如预期的那样),但是当我增加 jmeter 中的线程数使平均响应时间为 500 毫秒时,同步代码是还是更快。我已经尝试在数据库中使用 1000 行和 20000 行,但它仍然更快。我正在尝试找到一种异步函数比同步函数更快但我遇到问题的场景,是否有什么我弄错或误解的地方?
【问题讨论】:
-
你确定数据库不是瓶颈吗?数据库可以对不同的处理请求一一而不是同时做出反应。这可能是一些锁定。
-
数据库使用默认的隔离级别READ COMMITTED,除了我没有更改数据库中的任何内容,所以我假设没有锁?
-
见async is not a silver bullet。如果您的数据库只有一个 SQL Express 后端,则需要 restrict your web server thread pool size 才能看到
async的优势。 -
@StephenCleary 我查看了您的链接并尝试在我的 MVC ASP.NET Core 服务器中将 SetMaxThreads 设置为我的 Main() 函数的三行添加并运行我的 jmeter 基准测试与 500 个用户但它和我没用的时候没什么区别。我认为它会限制服务器中的总线程池,但它似乎不起作用,有什么提示吗?
-
@Nygards:我不知道。很多年前,当我编写该代码时,它就起作用了。
标签: c# entity-framework asp.net-core asynchronous benchmarking