5 Способов Повысить Производительность Кода C# Бесплатно
5. Материализуйте запросы LINQ один раз
При написании запросов LINQ с использованием интерфейсов
IEnumerable или IQueryable разработчики могут материализовать запрос (вызвать ToList, ToArray или аналогичные методы) или не делать этого, что позволяет лениво работать с коллекциями. Но иногда возникает необходимость перебрать одну и ту же коллекцию несколько раз. Если запрос не был материализован, повторный перебор коллекции повлияет на производительность.public void NotMaterializedQueryTest()В этом примере запрос
{
var elements = Enumerable.Range(0, 50000000);
var filtered =
elements.Where(e => e % 100000 == 0);
foreach (var e in filtered)
{
…
}
foreach (var e in filtered)
{
…
}
foreach (var e in filtered)
{
…
}
}
Where не материализуется. Вызов метода Where просто возвращает объект, реализующий интерфейс IEnumerable. Методы GetEnumerator и MoveNext будут вызываться только при итерации по коллекции в цикле foreach.Вот пример с материализованным запросом:
public void MaterializedQueryTest()Второй метод из-за материализации запроса с помощью
{
var elements = Enumerable.Range(0, 50000000);
var filtered =
elements.Where(e => e % 100000 == 0).ToList();
//остальной код такой же
}
ToList будет работать в 3 раза быстрее первого.| Method | Mean |Источник: https://levelup.gitconnected.com/5-ways-to-improve-the-performance-of-c-code-for-free-c89188eba5da
|------------------------- |-----------:|
| NotMaterializedQueryTest | 1,299.6 ms |
| MaterializedQueryTest | 495.5 ms |