エンジニアの備忘録

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

C#で"IEnumerable"型のメモリ使用量

"IEnumerable"型はメモリ使用量が少ないと聞きますが、
実際にどのくらい少ないのか、
また、どのような処理をすると使用量が増えるのか実際に試してみました。

処理内容

IEnumerableに1億個入れて、その時の処理でメモリ使用量を調査

Create : 0.9453KB

IEnumerable<int> num = Enumerable.Range(0, 100000000);

Select +1 : 0.0938KB

num.Select(x => x + 1);

Where Count : 0.0898KB

int count = num.Where(x => x % 2 == 0).Count();

ToList : 381.7305KB

List<int> list = num.ToList();

まとめ

"IEnumerable"型はそのままで扱う時はメモリ使用量少ないですね。
"ToList()"すると増えてしまうので、できる限り"IEnumerable"のまま使うのがベストですね。

全コード

public static class LinqMemory
{
    private static double previousVal = 0;
    public static void Check()
    {
        UseMemory("Initial");

        IEnumerable<int> num = Enumerable.Range(0, 100000000);
        UseMemory("Create");

        num.Select(x => x + 1);
        UseMemory("Select +1");

        int count = num.Where(x => x % 2 == 0).Count();
        UseMemory("Where Count");

        List<int> list = num.ToList();
        UseMemory("ToList");
    }
    public static void UseMemory(string name)
    {
        double currentVal = Environment.WorkingSet;
        double diffVal = (currentVal - previousVal) / 1024 / 1024;
        Console.WriteLine(string.Format("{0} : {1}KB", name, diffVal.ToString("F4")));
        previousVal = currentVal;
    }
}