Как проверить разницу в производительности структуры сущностей между объединением с любым и булевой проверкой? - PullRequest
1 голос
/ 23 января 2020

Мне было интересно, может кто-нибудь сказать мне, какая разница в производительности будет между выполнением запроса EF, подобного этому

var users = _context.Users.Include(p => p.Photos)
   .Where(p => p.Photos.Any())
   .AsQueryable();

, и этим

var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.HasPhoto == true) 
    .AsQueryable();

лучше проверить булево значение «HasPhoto» в «User», или .Any () в ICollection будет работать быстро и на больших наборах данных? Как проверить разницу в скорости, каким инструментом?

Ответы [ 2 ]

1 голос
/ 23 января 2020

Почему бы не попробовать! Вы можете использовать таймер для измерения времени на стенде. попробуйте использовать что-то вроде этого

var watchOne = System.Diagnostics.Stopwatch.StartNew();
testOne();
watchOne.Stop();
var resOne = watchOne.ElapsedMilliseconds;

var watchTwo = System.Diagnostics.Stopwatch.StartNew();
testTwo();
watchTwo.Stop();
var resTwo= watchTwo.ElapsedMilliseconds;

public void testOne(){
    var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.Photos.Any())
    .AsQueryable();
}

public void testTwo(){
    var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.HasPhoto == true) 
    .AsQueryable();
}
0 голосов
/ 23 января 2020

Рассмотрим аспекты производительности Entity Framework в целом:

  1. Загрузка и проверка данных имеют Низкий ¹ Относительная стоимость .
  2. Выполнение запроса также имеет Низкий ¹ Относительная стоимость

¹ [Общая стоимость увеличивается пропорционально количеству возвращаемых объектов по запросу].

И учитывая, что и

var users = _context.Users.Include(p => p.Photos)
   .Where(p => p.Photos.Any())
   .AsQueryable();

, и

var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.HasPhoto == true) 
    .AsQueryable();

возвращают идентичные результаты, фактическое время возврата будет считаться миллисекундами.

Однако , рассмотрим, что набор результатов является относительно большим, и рассмотрим метод расширения .Any() LINQ

public static bool Any<TSource> (this System.Collections.Generic.IEnumerable<TSource> source)

и что этот метод не возвращает ни одного элемента коллекции. Вместо этого он определяет, содержит ли коллекция какие-либо элементы (следовательно, сокращается общее время выполнения).

Таким образом, в конечном итоге метод расширения Any() будет работать лучше.

...