tags:

views:

313

answers:

8

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?

A: 

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

jarrett
A: 

There should be no percievable difference in performance.

Jacob Adams
+10  A: 

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.

dtb
A: 

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.

Mystere Man
I'm pretty sure the CLR doesn't allocate "a new variable" on each iteration of a loop.
dtb
Well, the compiler may well optimize that away, but stack space has to be allocated for any variables in a loop. This would be implementation dependant and one implementation may simply keep the stack frame the same, while another (say Mono) could release the stack then recreate it on each loop.
Mystere Man
All local variables in a method (top-level or nested in a loop) are compiled to method-level variables in IL. The space for the variables is allocated before the method is executed, not when a branch with the declaration in C# is reached.
dtb
+2  A: 

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();
Mark Byers
I love the line "Always try to declare variables in the smallest scope necessary."I think a single line can answer the question very well.
Manjoor
+1  A: 

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.

csj
+2  A: 

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.

Tordek
+2  A: 

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

Kev
thx for the tip, i think i will time some other stuff i've been woundering about aswell hehe :D
Marcus
If you want to go further with looking into what affects performance, look into using a code profiler. If nothing else, it will start to give you an idea of what type of code and operations take most time. ProfileSharp and EqatecProfilers are free and sufficient to get you started.
Kev