"foreach" VS "Список <T>. Foreach" ... который побеждает - PullRequest
5 голосов
/ 09 ноября 2011

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

  List<int> intList;
  foreach (int i in intList)

или

intList.ForEach(i => result += i);

Ответы [ 3 ]

13 голосов
/ 09 ноября 2011

TL; DR: разница в производительности здесь почти наверняка незначительна в реальном приложении, и в любом случае есть более читаемый способ достижения того же результата.Тем не менее, по-прежнему интересно видеть различия в скомпилированном коде.

Если предположить, что полный код действительно:

int result = 0;
foreach (int i in intList)
{
    result += i;
}

против

int result = 0;
intList.ForEach(i => result += i);

, тогда первая форма довольнопроще с точки зрения того, что генерируется - вы получите только локальную переменную, код для итерации по списку (используя List<T>.Enumerator) и IL, который добавляет значение к локальной переменной.

Втораяform нужно будет сгенерировать новый класс с переменной экземпляра для result вместе с методом, который будет использоваться в качестве делегата.Код будет преобразован в:

CompilerGeneratedClass tmp = new CompilerGeneratedClass();
tmp.result = 0;
Action<int> tmpDelegate = new Action<int>(tmp.CompilerGeneratedMethod);
intList.ForEach(tmpDelegate);

Кроме того, существуют философские различия между foreach и ForEach, которые Эрик Липперт написал о .

Лично я бы просто использовал LINQ, хотя:

int result = intList.Sum();

Я сомневаюсь, что различия в производительности на самом деле станут узким местом в реальном коде, но версия LINQсамое чистое ИМО, и это всегда хорошая вещь.

1 голос
/ 09 ноября 2011

Вы можете измерить время, которое требуется каждому из них, вот так:

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

«Ваш код здесь»

stopWatch.Stop();
Console.WriteLine(stopWatch.Elapsed.ToString());
1 голос
/ 09 ноября 2011

см. этот тест .в вашем примере это выглядит так, что List<int>.ForEach() будет действительно быстрее.

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