C#で型毎のメモリ使用量(List, int[], IEnumerable, HashSet, ObservableCollection)
- 処理内容
- IEnumerable : 0.95MB
- List : 381.79MB
- int[] : 381.73MB
- HashSet : 4229.51MB
- ObservableCollection : 768.42MB
- まとめ
- 全コード
C#で型を選ぶ時にどの型がどのくらいメモリを使用するのか・・・
小さいシステムなら問題ないですが、
大きいシステムだとメモリリークを起こしてしまう可能性があります。
なので、実際に試してみました。
処理内容
それぞれの型で1億個作ってその時のメモリ増加を調べる
IEnumerable : 0.95MB
IEnumerable<int> num = Enumerable.Range(0, 100000000);
List : 381.79MB
List<int> list = num.ToList();
int[] : 381.73MB
int[] ary = num.ToArray();
HashSet : 4229.51MB
HashSet<int> hashSet = num.ToHashSet();
ObservableCollection : 768.42MB
ObservableCollection<int> ob = new ObservableCollection<int>(num);
まとめ
やっぱり”IEnumerable
そして”List”よりも”ObservableCollection”の方が多いですね。
WPFで”ObservableCollection”は使ってしまうので、
メモリ使用量が増えて遅くなるんですね。
全コード
public static class ListMemory { private static double previousVal = 0; public static void Check() { UseMemory("Initial"); IEnumerable<int> num = Enumerable.Range(0, 100000000); UseMemory("IEnumerable<int>"); List<int> list = num.ToList(); UseMemory("List<int>"); int[] ary = num.ToArray(); UseMemory("int[]"); HashSet<int> hashSet = num.ToHashSet(); UseMemory("HashSet<int>"); ObservableCollection<int> ob = new ObservableCollection<int>(num); UseMemory("ObservableCollection<int>"); } public static void UseMemory(string name) { double currentVal = Environment.WorkingSet; double diffVal = (currentVal - previousVal) / 1024 / 1024; Console.WriteLine(string.Format("{0} : {1}MB", name, diffVal.ToString("F2"))); previousVal = currentVal; } }