Производительность foreach против Where (). Select () - PullRequest
0 голосов
/ 09 октября 2018

Этот вопрос касается сравнения методов foreach и Linq с точки зрения производительности.Код, который я привожу ниже, является лишь примером, который у меня есть в настоящее время.


Есть ли преимущество использования .Where (). Select () по сравнению с циклом foreach (с точки зрения производительности)?

У меня есть этот блок C #, и я хотел бы улучшить производительность здесь:

var resultList = new List<MyItemWrapper>();
foreach (var key in KeysCollection)
{
    if (SomeCondition(key))
    {
        var anotherKey = CreateAnotherKey(key);
        if (AnotherCondition(anotherKey))
        {
            resultList.Add(new MyItemWrapper { Id = key });
        }
    }
}

Я пытался использовать Where (). Select (), а также пытался сделать это AsPArallel (), нонет улучшения в производительности.Напротив, я вижу, что производительность ухудшается.

var resultList = KeysCollection
                    .Where(key =>
                    {
                        if (!SomeCondition(key))
                            return false;

                        var anotherKey = CreateAnotherKey(key);
                        return AnotherCondition(anotherKey);
                    })
                    .Select(key => new MyItemWrapper { Id = key })
                    .ToList();

Примечания:

  • SomeCondition() и AnotherCondition() следует рассматривать как черные ящики.
  • возвращаемое resultList должно быть IList.
  • KeysCollection имеет тип ICollection

Может кто-нибудь, пожалуйста, помогите и дайте советыулучшить это?

1 Ответ

0 голосов
/ 09 октября 2018

Linq не предназначен для улучшения производительности .Он предназначен для улучшения эффективности кодирования .В некоторых случаях он может быть более производительным, чем циклы bad (например, когда вы ищете наличие элемента, Any остановится, когда элемент будет найден, но плохой цикл может продолжить цикл), но в целом это не улучшит производительность.

Так что используйте то, что вы понимаете лучше (ИМХО, где делегат, который вы используете, гораздо сложнее понять) и используйте Linq для улучшения читабельности.

Если у вас выявлена ​​ проблема с производительностью, найдите хорошего профилировщика, чтобы определить, где больше всего времени тратится.Я был бы удивлен, если бы методы Linq на самом деле были узким местом.

Тем не менее, вы могли бы также структурировать запрос следующим образом:

var reslutList = KeysCollection.Where(key => SomeCondition(key))
                               .Where(key => AnotherCondition(CreateAnotherKey(key)))
                               .Select(key => new MyItemWrapper { Id = key })
                               .ToList();

Какой может быть проще для понимания, чем цикл или пользовательский делегат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...