C#でforeach時の型毎の処理速度(List, Array, IEnumerable, HashSet, ObservableCollection)
- 処理内容
- List : 0.5679秒
- Array : 0.2823秒
- IEnumerable : 0.5405秒
- HashSet : 0.4922秒
- ObservableCollection : 0.7412360
- まとめ
- 全コード
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) { //処理なし } }