For vs. For Each vs. While in C#

Introduction

I am often asked by some people/colleagues, "which loop is faster?" "Which loop has higher performance?" Etc. I have heard that the For loop is faster than the For...each loop but I have never tried it before. So, I decided to see how big the difference is among all the loops and which one is faster at looping through an array and a list in terms of speed and performance.

Let's start our journey to fin the best C# loop. For this exercise, I'll be creating a console application in Visual Studio 2017.

First, I'm going to create one class called CustomStopwatch   which helps to track the starting and ending times of loops. 

using System;  
using System.Diagnostics;  

namespace ConsoleApp2  
{  
    public class CustomStopwatch : Stopwatch  
    {  

        public DateTime? StartAt { get; private set; }  
        public DateTime? EndAt { get; private set; }  


        public void Start()  
        {  
            StartAt = DateTime.Now;  

            base.Start();  
        }  

        public void Stop()  
        {  
            EndAt = DateTime.Now;  

            base.Stop();  
        }  

        public void Reset()  
        {  
            StartAt = null;  
            EndAt = null;  

            base.Reset();  
        }  

        public void Restart()  
        {  
            StartAt = DateTime.Now;  
            EndAt = null;  

            base.Restart();  
        }  

    }  
}

Custom stop watch code in C#

Now, it is time to write code in the Program.cs class. First, I'm going to implement a For loop on:

  • a single integer.
  • an array.
  • a list.
using System;  
using System.Linq;  

namespace ConsoleApp2  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            CustomStopwatch sw = new CustomStopwatch();  
            sw.Start();  
            for (int i = 0; i < 10000; i++) Console.WriteLine(i);  
            sw.Stop();  

            CustomStopwatch sw1 = new CustomStopwatch();  
            int[] array = Enumerable.Range(0, 10000).ToArray();  
            sw1.Start();  
            for (int i = 0; i < array.Length; i++) Console.WriteLine(array[i]);  
            sw1.Stop();  

            CustomStopwatch sw2 = new CustomStopwatch();  
            var arrList = array.ToList();  
            sw2.Start();  
            for (int i = 0; i < arrList.Count; i++) Console.WriteLine(arrList[i]);  
            sw2.Stop();  

            Console.WriteLine($"for Time elapsed: {sw.ElapsedMilliseconds} Milliseconds, StartAt: {sw.StartAt.Value}, EndAt: {sw.EndAt.Value}");  
            Console.WriteLine($"for on array Time elapsed: {sw1.ElapsedMilliseconds} Milliseconds, StartAt: {sw1.StartAt.Value}, EndAt: {sw1.EndAt.Value}");  
            Console.WriteLine($"for on list Time elapsed: {sw2.ElapsedMilliseconds} Milliseconds, StartAt: {sw2.StartAt.Value}, EndAt: {sw2.EndAt.Value}");  
            Console.ReadKey();  
        }  

    }  
}

For Loop Test

Let's run the script to see output and execution time in milliseconds.

For Loop Performance

As per my output, the For loop on the list is faster.

Let's compare the For...each loop on the list and array.

using System;  
using System.Linq;  

namespace ConsoleApp2  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            int[] array = Enumerable.Range(0, 10000).ToArray();  
            var arrList = array.ToList();  

            CustomStopwatch sw1 = new CustomStopwatch();  
            sw1.Start();  
            foreach (var arr in array) Console.WriteLine(arr);  
            sw1.Stop();  

            CustomStopwatch sw2 = new CustomStopwatch();  
            sw2.Start();  
            foreach (var arr in arrList) Console.WriteLine(arr);  
            sw2.Stop();  

            Console.Clear();  
            Console.WriteLine($"for each on array Time elapsed: {sw1.ElapsedMilliseconds} Milliseconds, StartAt: {sw1.StartAt.Value}, EndAt: {sw1.EndAt.Value}");  
            Console.WriteLine($"for each on list Time elapsed: {sw2.ElapsedMilliseconds} Milliseconds, StartAt: {sw2.StartAt.Value}, EndAt: {sw2.EndAt.Value}");  
            Console.ReadKey();  
        }  
    }  
}

For...Each Loop

Let's run to see output and execution time in milliseconds.

For...Each Loop Performance

Here, the For...each loop on the list is faster.

Let's compare the While loop on the list and an array.

using System;  
using System.Linq;  

namespace ConsoleApp2  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            int[] array = Enumerable.Range(0, 10000).ToArray();  
            var arrList = array.ToList();  

            CustomStopwatch sw1 = new CustomStopwatch();  
            sw1.Start();  
            int i = 0;  
            while (i != array.Length) Console.WriteLine(array[i++]);  
            sw1.Stop();  

            CustomStopwatch sw2 = new CustomStopwatch();  
            sw2.Start();  
            i = 0;  
            while (i != arrList.Count) Console.WriteLine(arrList[i++]);  
            sw2.Stop();  

            Console.Clear();  
            Console.WriteLine($"while on array Time elapsed: {sw1.ElapsedMilliseconds} Milliseconds, StartAt: {sw1.StartAt.Value}, EndAt: {sw1.EndAt.Value}");  
            Console.WriteLine($"while on list Time elapsed: {sw2.ElapsedMilliseconds} Milliseconds, StartAt: {sw2.StartAt.Value}, EndAt: {sw2.EndAt.Value}");  
            Console.ReadKey();  
        }  
    }  
}

While Loop

And the output of While loop is as below.

While Loop Performance

The While loop is faster at looping through the list.

Conclusion

This article covered a quick comparison of For, For...each, and While loops on arrays and lists. As I said before, an array is faster than a list, but, as per my observation (in terms of iteration), a list is faster, as we can see in the outputs. I think it depends on the data and the way you use the data. My personal suggestion is that we should use a list instead of an array for the below reasons.

Resize()

Please give your valuable feedback/comments/questions about this article below. Please let me know how you like and understand this article and how I could improve it.

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章