Асинхронные вызовы медленнее, чем синхронизация при использовании EF Core - PullRequest
0 голосов
/ 25 сентября 2018

Любая идея, почему этот код занимает 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

1 Ответ

0 голосов
/ 25 сентября 2018

Невозможно сказать точно без большего контекста, но в целом, я думаю, вы ошибочно полагаете, что асинхронность должна быть быстрее, хотя на самом деле все наоборот.

Асинхронность - это масштаб, а не производительность.Это позволяет вам использовать ресурсы сервера более эффективно, но для этого есть затраты, пусть даже минимальные, на производительность.С асинхронностью, переключением потоков и т. Д. Связаны накладные расходы, которые могут сделать одну и ту же операцию медленнее, чем эквивалентная операция синхронизации.Однако синхронизация не дает возможности использовать поток для другой работы, когда он не используется, поэтому вы ограничиваете потенциальную пропускную способность сервера с помощью операций синхронизации.Это компромисс, который обычно ложится на сторону асинхронности как лучший подход.

...