Home » c# » Declaring a variable inside or outside an foreach loop: which is faster/better?

Declaring a variable inside or outside an foreach loop: which is faster/better?

Posted by: admin November 29, 2017 Leave a comment

Questions:

Which one of these is the faster/better one?

This one:

List<User> list = new List<User>();
User u;

foreach (string s in l)
{
    u = new User();
    u.Name = s;
    list.Add(u);
}

Or this one:

List<User> list = new List<User>();

foreach (string s in l)
{
    User u = new User();
    u.Name = s;
    list.Add(u);
}

My newbie-developing skills tells me the first one is better, but a friend of mine tells me im wrong, but could not give me a good reason why the second one is better.

Is there any difference in performance at all?

Answers:

Performance-wise both examples are compiled to the same IL, so there’s no difference.

The second is better, because it more clearly expresses your intent if u is only used inside the loop.

Questions:
Answers:

In any case, the best way would be to use a constructor that takes a Name… or, otherwise, exploit curly-brace notation:

foreach (string s in l)
{
    list.Add(new User(s));
}

or

foreach (string s in l)
{
    list.Add(new User() { Name = s });
}

or even better, LINQ:

var list = l.Select( s => new User { Name = s});

Now, while your first example could, in some cases, be unperceptibly faster, the second one is better because it’s more readable, and the compiler may discard the variable (and omit it altogether) since it’s not used outsid the foreach‘s scope.

Questions:
Answers:

A declaration does not cause any code to be executed, so it’s not a performance issue.

The second one is what you mean, and you’re less likely to make a stupid error if you do it the second way, so use that. Always try to declare variables in the smallest scope necessary.

And besides, the better way is to use Linq:

List<User> users = l.Select(name => new User{ Name = name }).ToList();

Questions:
Answers:

Whenever you’ve a question about performance, the only thing to do is measure – run a loop around your test and time it.

To answer your question – without measuring 🙂 or looking at the generated ilasm – any difference wouldn’t be noticeable in a meaningful number of iterations and the most expensive operation in your code there is likely to be the user allocation by a few orders of magnitude, so concentrate on code clarity (as you should in general) and go with 2.

Oh, its late and I guess I’m just trying to say don’t worry about this sort of thing or get caught up in details like this.

K

Questions:
Answers:

The 2nd one is better. You are meaning to have a new user in each iteration.

Questions:
Answers:

Technically, the first example will save a few nanoseconds because the stack frame will not have to be moved to allocate a new variable, but this is such a tiny amount of CPU time you won’t notice it, that’s if the compiler doesn’t optimize any difference away anyays.

Questions:
Answers:

In this scenario, the second version is better.

In general, if you only need to access the value within the body of the iteration, then choose the second version. On the other hand, if there is some final state the variable will hold beyond the body of the loop, then declare then use the first version.

Questions:
Answers:

There should be no percievable difference in performance.

Questions:
Answers:

Another reference which looks like above:

http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/d43aaba5-a58b-4610-bea4-5bc5d6741f98