Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is one of these for loops faster than the other?

Tags:

c#

for (var keyValue = 0; keyValue < dwhSessionDto.KeyValues.Count; keyValue++)
{...}


var count = dwhSessionDto.KeyValues.Count;
for (var keyValue = 0; keyValue < count; keyValue++)
{...}

I know there's a difference between the two, but is one of them faster than the other? I would think the second is faster.

like image 226
Lieven Cardoen Avatar asked Dec 03 '10 09:12

Lieven Cardoen


People also ask

Which for loop is faster?

The for loop is the fastest but poorly readable. The foreach is fast, and iteration is controllable. The for…of takes time, but it's sweeter. The for…in takes time, hence less convenient.

Is for loop faster than other loops?

Efficiency, and While vs For Using for: % Time elapsed: 0.0010001659 seconds. Using while: % Time elapsed: 0.026000023 seconds. The main reason that While is much slower is because the while loop checks the condition after each iteration, so if you are going to write this code, just use a for loop instead.

Are for each loops faster?

The FOR loop without length caching and FOREACH work slightly faster on arrays than FOR with length caching. Array. Foreach performance is approximately 6 times slower than FOR / FOREACH performance. The FOR loop without length caching works 3 times slower on lists, comparing to arrays.

Are two for loops slower than one?

Theoretically, They'd run the same, as they're both linear. (Both are 100 iterations). So the Big O Time Complexity is O(N), where N is the size of the loop. This is true if access to every instruction and memory takes the same time under any condition (idealized system).


2 Answers

Yes, the first version is much slower. After all, I'm assuming you're dealing with types like this:

public class SlowCountProvider
{
    public int Count
    {
        get
        {
            Thread.Sleep(1000);
            return 10;
        }
    }
}

public class KeyValuesWithSlowCountProvider
{
    public SlowCountProvider KeyValues
    {
        get { return new SlowCountProvider(); }
    }
}

Here, your first loop will take ~10 seconds, whereas your second loop will take ~1 second.

Of course, you might argue that the assumption that you're using this code is unjustified - but my point is that the right answer will depend on the types involved, and the question doesn't state what those types are.

Now if you're actually dealing with a type where accessing KeyValues and Count is cheap (which is quite likely) I wouldn't expect there to be much difference. Mind you, I'd almost always prefer to use foreach where possible:

foreach (var pair in dwhSessionDto.KeyValues)
{
    // Use pair here
}

That way you never need the count. But then, you haven't said what you're trying to do inside the loop either. (Hint: to get more useful answers, provide more information.)

like image 178
Jon Skeet Avatar answered Oct 09 '22 13:10

Jon Skeet


it depends how difficult it is to compute dwhSessionDto.KeyValues.Count if its just a pointer to an int then the speed of each version will be the same. However, if the Count value needs to be calculated, then it will be calculated every time, and therefore impede perfomance.

EDIT -- heres some code to demonstrate that the condition is always re-evaluated

public class Temp
{
    public int Count { get; set; }
}

static void Main(string[] args)
{
    var t = new Temp() {Count = 5};
    for (int i = 0; i < t.Count; i++)
    {
        Console.WriteLine(i);
        t.Count--;
    }
    Console.ReadLine();
}

The output is 0, 1, 2 - only !

like image 21
Dean Chalk Avatar answered Oct 09 '22 13:10

Dean Chalk