有没有想法为什么这段代码需要 49 毫秒?
public void OnGet(String sessionId)
{
BackgroundEntry = _context.BackgroundEntry.Where(x => x.Id == sessionId).ToList();
}
但是这段代码需要300+毫秒的时间吗?
public async Task OnGetAsync(String sessionId)
{
BackgroundEntry = await _context.BackgroundEntry.Where(x => x.Id == sessionId).ToListAsync();
}
我希望两者时间相同。
在不同的条件下进行测试,结果始终如此,异步有300多毫秒的延迟。
BackgroundEntry由EF自动生成:
public partial class BackgroundEntry
{
public string Id { get; set; }
public string Part { get; set; }
public long Datetime { get; set; }
public DateTime CreatedAt { get; set; }
public Guid Session { get; set; }
public string Action { get; set; }
public string Domain { get; set; }
public string Location { get; set; }
public long? LastEntryDatetime { get; set; }
public BackgroundEntry BackgroundEntryNavigation { get; set; }
public BackgroundEntry InverseBackgroundEntryNavigation { get; set; }
}
使用秒表进行基准测试:
using (Models.RecorderContext context = new Models.RecorderContext())
{
sw.Start();
var BackgroundEntry = context.BackgroundEntry.Where(x => x.Id == sessionId).ToList();
sw.Stop();
}
var g = sw.ElapsedMilliseconds;
sw.Reset();
// g = 22 ms
using (Models.RecorderContext context = new Models.RecorderContext())
{
sw.Start();
var BackgroundEntry = await context.BackgroundEntry.Where(x => x.Id == sessionId).ToListAsync();
sw.Stop();
}
g = sw.ElapsedMilliseconds;
// g = 328 ms
BackgroundEntry
的实现吗? - FCinStopWatch
包装调用,以确保您只测量数据库调用。我还建议使用新的DbContext
进行隔离,以确保它没有带入其他缓存数据。在循环内进行多次调用也可能有所帮助,以便平均化“噪声”,并确保您没有处理 JIT 神器。 - Bradley Uffner