Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"foreach" VS "List<T>.Foreach"...which wins

speaking on performance level which is more preferred to be used and is lighter in terms of compiler work and there any major differences?

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

or

intList.ForEach(i => result += i);
like image 683
SShebly Avatar asked Dec 06 '22 18:12

SShebly


1 Answers

TL;DR: The performance difference here is almost certainly insignificant in a real application, and there's a more readable way of achieving the same result anyway. It's still interesting to see the differences in compiled code though.

Assuming the full code is actually:

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

vs

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

then the first form is rather simpler in terms of what gets generated - you'll end up with just a local variable, code to iterate over the list (using List<T>.Enumerator) and IL which adds the value to the local variable.

The second form will need to generate a new class with an instance variable for result, along with a method to be used as the delegate. The code will be converted to:

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

On top of that there's the philosophical differences between foreach and ForEach which Eric Lippert has written about.

Personally I'd just use LINQ though:

int result = intList.Sum();

I doubt that the performance differences will actually be a bottleneck in real code, but the LINQ version is the clearest IMO, and that's always a good thing.

like image 193
Jon Skeet Avatar answered Dec 18 '22 03:12

Jon Skeet