2016-11-04 2 views
1

Я изменил проект Github, чтобы проверить еще некоторые связанные с Entity Framework способы выполнения запросов.Entity Framework 6 Производительность методов Async vs Способы синхронизации

Link

Модели:

[Table("Player")] 
public partial class Player 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(200)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(200)] 
    public string LastName { get; set; } 

    public DateTime DateOfBirth { get; set; } 

    public int TeamId { get; set; } 

    public virtual Team Team { get; set; } 
} 

[Table("Team")] 
public partial class Team 
{ 
    public Team() 
    { 
     Players = new HashSet<Player>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    [StringLength(200)] 
    public string Name { get; set; } 

    public DateTime FoundingDate { get; set; } 

    public int SportId { get; set; } 

    public virtual ICollection<Player> Players { get; set; } 

    public virtual Sport Sport { get; set; } 
} 

[Table("Sport")] 
public partial class Sport 
{ 
    public Sport() 
    { 
     Teams = new HashSet<Team>(); 
    } 

    public int Id { get; set; } 

    [StringLength(100)] 
    public string Name { get; set; } 

    public virtual ICollection<Team> Teams { get; set; } 
} 

Что я тестирование на эти вещи:

EF "Синхронизировать" - FirstOrDefault() и ToList()

context.Players.FirstOrDefault(x => x.Id == id); 

context.Players.AsNoTracking().Where(x => x.TeamId == teamId).ToList(); 

context.Teams.AsNoTracking().Include(x => x.Players).Where(x => x.SportId == sportId).ToList(); 

EF "Асинхронный" - FirstOrDefaultAsync() и ToListAsync()

await context.Players.FirstOrDefaultAsync(x => x.Id == id); 

await context.Players.AsNoTracking().Where(x => x.TeamId == teamId).ToListAsync(); 

await context.Teams.AsNoTracking().Include(x => x.Players).Where(x => x.SportId == sportId).ToListAsync(); 

EF "Sync" с Select в DTO объекты

context.Players.Select(p => new PlayerDTO() 
       { 
        Id = p.Id, 
        FirstName = p.FirstName, 
        DateOfBirth = p.DateOfBirth, 
        LastName = p.LastName, 
        TeamId = p.TeamId 

       }).FirstOrDefault(x => x.Id == id); 

context.Players.Where(x => x.TeamId == teamId).Select(p => new PlayerDTO() 
       { 
        Id = p.Id, 
        FirstName = p.FirstName, 
        DateOfBirth = p.DateOfBirth, 
        LastName = p.LastName, 
        TeamId = p.TeamId 
       }).ToList(); 

context.Teams.Where(x => x.SportId == sportId).Select(t => new TeamDTO() 
        { 
         Id = t.Id, 
         FoundingDate = t.FoundingDate, 
         Name = t.Name, 
         SportId = t.SportId, 
         Players = t.Players.Select(p => new PlayerDTO() 
         { 
          Id = p.Id, 
          FirstName = p.FirstName, 
          DateOfBirth = p.DateOfBirth, 
          LastName = p.LastName, 
          TeamId = p.TeamId 
         }).ToList() 
        }).ToList(); 

EF "Async" с Select в DTO объекты

await context.Players.Select(p => new PlayerDTO() 
       { 
        Id = p.Id, 
        FirstName = p.FirstName, 
        DateOfBirth = p.DateOfBirth, 
        LastName = p.LastName, 
        TeamId = p.TeamId 

       }).FirstOrDefaultAsync(x => x.Id == id); 

await context.Players.Where(x => x.TeamId == teamId).Select(p => new PlayerDTO() 
       { 
        Id = p.Id, 
        FirstName = p.FirstName, 
        DateOfBirth = p.DateOfBirth, 
        LastName = p.LastName, 
        TeamId = p.TeamId 
       }).ToListAsync(); 

await context.Teams.Where(x => x.SportId == sportId).Select(t => new TeamDTO() 
       { 
        Id = t.Id, 
        FoundingDate = t.FoundingDate, 
        Name = t.Name, 
        SportId = t.SportId, 
        Players = t.Players.Select(p => new PlayerDTO() 
        { 
         Id = p.Id, 
         FirstName = p.FirstName, 
         DateOfBirth = p.DateOfBirth, 
         LastName = p.LastName, 
         TeamId = p.TeamId 
        }).ToList() 
       }).ToListAsync(); 

мой результат довольно хлопотный, я думаю. главным образом потому, что MS продвигает Async часть EF alot.

Мои результаты: (в миллисекундах)

Количество спорта: 8, Количество команд: 30, Количество игроков: 100

EntityFrameworkAsyncDTO Results 
Run # Player by ID   Players per Team    Teams per Sport 
0    1,46     3,47     35,88 
1    1,04     3      33 
2    1,02     3,3      33,75 
3    1,03     3      31,75 
4    1,1      3,27     31,38 
EntityFrameworkAsync Results 
Run # Player by ID   Players per Team    Teams per Sport 
0    1,17     3,53     57 
1    1,01     3      48,62 
2    0,99     3,03     47,88 
3    1,02     3,07     51 
4    1      3,03     48,88 
EntityFrameworkDTO Results 
Run # Player by ID   Players per Team    Teams per Sport 
0    0,02     3      13,25 
1    0,01     2,8      13,12 
2    0,15     2,97     13,25 
3    0,02     2,9      13,25 
4    0,05     2,8      13,12 
EntityFramework Results 
Run # Player by ID   Players per Team    Teams per Sport 
0    0,01     2,27     28,38 
1    0,01     2,4      28,25 
2    0      2,13     28,5 
3    0,01     2,17     27,5 
4    0,01     2,13     29 
ADONET Results 
Run # Player by ID   Players per Team    Teams per Sport 
0    0      2,03     11,75 
1    0      2      12,62 
2    0      2      11,38 
3    0      2      12,38 
4    0      2      11,25 

/EDIT Я добавил, что раз ADO.NET к списку результатов в качестве ссылки.

Мой вопрос: Я делаю что-то не так с моими запросами, так как время загрузки так отличается?

В системе реального мира у меня есть работа, я изменил все мои вызовы Асинхронной БД на вызовы синхронизации, и для того, что я вижу в своей статистике, система видит увеличение скорости вызовов на 50%. Это система с 100-120 абонентами, подключенными через SignalR, очень тяжелая БД.

+1

Вы хотите сравнить First vs FirstAsync и Find vs FindAsync. Сначала и найдите довольно много работы. – vittore

+0

Кроме того, 'Async' не« быстрее ». Это добавляет много накладных расходов. Но это позволяет использовать время, когда вы ожидаете сказать, что сетевая связь. – vittore

+0

Я знаю, что Async/Await имеет накладные расходы, но я не думаю, что мои SQL-запросы через EF будут в 2-4 раза медленнее. –

ответ

0

Я думаю, this article подробно объясняет это.

Async не работает быстрее и добавляет много накладных расходов поверх нормального «синхронизированного» кода. Но это позволяет лучше использовать ресурсы в случаях, когда вы тратите свое время на ожидание (e g высокая латентность при подключении к сети и т. Д.)

Смежные вопросы