エンジニアの備忘録

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

C#で型毎のメモリ使用量(List, int[], IEnumerable, HashSet, ObservableCollection)

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;
    }
}