如何测量C#中方法的平均内存消耗和峰值内存?

时间:2017-08-30 17:45:47

标签: c# memory

我编写了一段代码来测量方法的内存消耗(平均内存和峰值内存值)。 我只是在一个线程中运行该方法并在一个循环中调用GC.GetTotalMemory(false),该循环检查线程是否仍处于活动状态,然后计算当前内存并将其添加到" totalmem"变量以获得平均值。 我也把这个分析器称为循环,因为我需要在多组不同的参数上运行它(例如测量不同文件中的消耗),所以我需要等到单个线程完成并收集垃圾然后开始下一个分析。 我的问题是:这是一种不好的方式,输出是接近真实的还是准确的?测量单线程存储器是否等于测量过程存储器?

      double totalmem = 0;
      long iterationsCount = 0;
      double PeakMemory = 0;

     var t = new Thread(() =>
        {                
            int output = methodToAnalyze(int a, string b);

            }

            Console.WriteLine("Finished thread");
        });

        t.Start();
        Console.WriteLine("Started thread running");
        while (t.IsAlive)
        {
            var mem = (double)GC.GetTotalMemory(false);

            // convert to MB
            mem = mem / (1024 * 1024);

            totalmem += mem;
            iterationsCount ++;
            if (mem > PeakMemory)
            {
                PeakMemory = mem;
            }
        }

        t.Join();

        var AverageMemory = (totalmem / iterationsCount);
        var ElapsedTimeInMs = elapsedMs;

1 个答案:

答案 0 :(得分:0)

我会研究使用System Diagnostics类。计算内存使用量时必须小心,因为根据收集的垃圾数量,结果会发生巨大变化。

Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;