エンジニアの備忘録

エンジニアの私が備忘録や思ったことをちょいちょい書いてます。

C#でforeach時の型毎の処理速度(List, Array, IEnumerable, HashSet, ObservableCollection)

C#でループを行う際に何の型を使えばいいか、
何を使うと一番早く処理が行えるのか実際に試してみました。

処理内容

1億回foreachを実行

List : 0.5679秒

List<int> list = _num.ToList();
foreach(int i in list) {
    Processing(i);
}

Array : 0.2823秒

int[] ary = _num.ToArray();
foreach(int i in ary) {
    Processing(i);
}

IEnumerable : 0.5405秒

Console.WriteLine("Array : " + _sw.Elapsed);
foreach(int i in _num) {
    Processing(i);
}

HashSet : 0.4922秒

HashSet<int> hashSet = _num.ToHashSet();
foreach (int i in hashSet) {
    Processing(i);
}

ObservableCollection : 0.7412360

ObservableCollection<int> ob = new ObservableCollection<int>(_num);
foreach (int i in ob) {
    Processing(i);
}

まとめ

Listが早いかと思いきや、int[]が一番早いのは驚きました。
しかも約2倍の速度差がありますね。
個人的にはListの方が使いやすいので悩みますね・・・

ObservableCollectionは通知処理が入っているのでやっぱり遅いですね。

全コード

Public class ListSpeed
{
    //1億
    private static IEnumerable<int> _num = Enumerable.Range(0, 100000000);
    private static Stopwatch _sw;
    public static void Check()
    {
        List<int> list = _num.ToList();
        _sw = Stopwatch.StartNew();
        foreach(int i in list)
        {
            Processing(i);
        }
        Console.WriteLine("List : " + _sw.Elapsed);
        int[] ary = _num.ToArray();
        _sw = Stopwatch.StartNew();
        foreach(int i in ary)
        {
            Processing(i);
        }
        Console.WriteLine("Array : " + _sw.Elapsed);
        _sw = Stopwatch.StartNew();
        foreach(int i in _num)
        {
            Processing(i);
        }
        Console.WriteLine("IEnumerable : " + _sw.Elapsed);
        HashSet<int> hashSet = _num.ToHashSet();
        _sw = Stopwatch.StartNew();
        foreach (int i in hashSet)
        {
            Processing(i);
        }
        Console.WriteLine("HashSet : " + _sw.Elapsed);

        ObservableCollection<int> ob = new ObservableCollection<int>(_num);
        _sw = Stopwatch.StartNew();
        foreach (int i in ob)
        {
            Processing(i);
        }
        Console.WriteLine("ObservableCollection : " + _sw.Elapsed);
    }
    private static void Processing(int i)
    {
        //処理なし
    }
}