In .NET, which loop runs faster, 'for' or 'foreach'?

前端 未结 30 1333
抹茶落季
抹茶落季 2020-11-22 04:25

In C#/VB.NET/.NET, which loop runs faster, for or foreach?

Ever since I read that a for loop works faster than a foreach

相关标签:
30条回答
  • 2020-11-22 04:31

    Jeffrey Richter talked the performance difference between for and foreach on a recent podcast: http://pixel8.infragistics.com/shows/everything.aspx#Episode:9317

    0 讨论(0)
  • 2020-11-22 04:31

    In most cases there's really no difference.

    Typically you always have to use foreach when you don't have an explicit numerical index, and you always have to use for when you don't actually have an iterable collection (e.g. iterating over a two-dimensional array grid in an upper triangle). There are some cases where you have a choice.

    One could argue that for loops can be a little more difficult to maintain if magic numbers start to appear in the code. You should be right to be annoyed at not being able to use a for loop and have to build a collection or use a lambda to build a subcollection instead just because for loops have been banned.

    0 讨论(0)
  • 2020-11-22 04:32

    Every language construct has an appropriate time and place for usage. There is a reason the C# language has a four separate iteration statements - each is there for a specific purpose, and has an appropriate use.

    I recommend sitting down with your boss and trying to rationally explain why a for loop has a purpose. There are times when a for iteration block more clearly describes an algorithm than a foreach iteration. When this is true, it is appropriate to use them.

    I'd also point out to your boss - Performance is not, and should not be an issue in any practical way - it's more a matter of expression the algorithm in a succinct, meaningful, maintainable manner. Micro-optimizations like this miss the point of performance optimization completely, since any real performance benefit will come from algorithmic redesign and refactoring, not loop restructuring.

    If, after a rational discussion, there is still this authoritarian view, it is up to you as to how to proceed. Personally, I would not be happy working in an environment where rational thought is discouraged, and would consider moving to another position under a different employer. However, I strongly recommend discussion prior to getting upset - there may just be a simple misunderstanding in place.

    0 讨论(0)
  • 2020-11-22 04:33

    Any time there's arguments over performance, you just need to write a small test so that you can use quantitative results to support your case.

    Use the StopWatch class and repeat something a few million times, for accuracy. (This might be hard without a for loop):

    using System.Diagnostics;
    //...
    Stopwatch sw = new Stopwatch()
    sw.Start()
    for(int i = 0; i < 1000000;i ++)
    {
        //do whatever it is you need to time
    }
    sw.Stop();
    //print out sw.ElapsedMilliseconds
    

    Fingers crossed the results of this show that the difference is negligible, and you might as well just do whatever results in the most maintainable code

    0 讨论(0)
  • 2020-11-22 04:33

    Unless you're in a specific speed optimization process, I would say use whichever method produces the easiest to read and maintain code.

    If an iterator is already setup, like with one of the collection classes, then the foreach is a good easy option. And if it's an integer range you're iterating, then for is probably cleaner.

    0 讨论(0)
  • 2020-11-22 04:34

    Patrick Smacchia blogged about this last month, with the following conclusions:

    • for loops on List are a bit more than 2 times cheaper than foreach loops on List.
    • Looping on array is around 2 times cheaper than looping on List.
    • As a consequence, looping on array using for is 5 times cheaper than looping on List using foreach (which I believe, is what we all do).
    0 讨论(0)
提交回复
热议问题