在工作中,我们讨论是否应该在 20 个用户的 ASP.NET Core 应用程序中使用同步快速查询(例如 EF 的 dbContext.Table.First()
)而不是异步版本,因为额外的时间来为异步操作创建另一个线程。
我对这两个版本进行了基准测试。
该应用程序在 Windows 10 计算机(i5、16 Gb、当前计时器间隔:0.999 毫秒)上运行。数据库位于本地网络中 Docker 中的另一台计算机上。
public async Task<DailyExchangeRate> GetExchangeRateAsync(int currencyId, DateTime date)
{
return await dbContext.DailyExchangeRates
.Where(dr => dr.CurrencyId == currencyId)
.FirstOrDefaultAsync(dr => dr.Date == date.Date);
}
public DailyExchangeRate GetExchangeRate(int currencyId, DateTime date)
{
return dbContext.DailyExchangeRates
.Where(dr => dr.CurrencyId == currencyId)
.FirstOrDefault(dr => dr.Date == date.Date);
}
为什么异步版本更快?
最佳答案
instead of the async versions due to additional time to create another thread for the async operation
为什么您认为对于每个异步操作都必须创建一个新线程?
已经有一个与服务器关联的线程池,这只是“解除阻塞”的问题,可以说给定线程,并使用它来处理另一个请求,因为对数据库的调用是异步的 - 没有必要阻塞直到 SQL 查询完成并返回。
当涉及到数据库的连接时,有一个由 EF 处理的数据库连接池,使用 FirstOrDefaultAsync
也会稍微提高性能,因为它可能会使用相同的连接来处理几个db 调用,而不是使用一个连接并等待来自 db 的结果 - 在 FirstOrDefault
同步调用中
关于c# - 为什么异步方法比 .NET Core 3.1 中的同步版本更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61970114/