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

3
我写了一段代码来测量一个方法的内存消耗(平均内存和峰值内存值)。我只是在一个线程中运行该方法,并调用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
我建议您使用System Diagnostics类。在计算内存使用量时,您需要小心,因为根据垃圾收集的内容不同,结果会有很大的差异。
Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;

有没有一种方法可以仅为我想要的方法分配计算?我如何将其称为进程? - yomna ali
你确定你当前的做法只是针对单个方法进行计算吗?根据文档,它返回当前分配的字节数。我将尝试运行一个示例应用程序进行测试。 - Sam Marion
经过一些测试,我确定当前的方法无法为您提供每个线程的内存使用情况。我不确定这是否有可能,但也许这个问题可以帮助您了解每个线程使用的CPU使用量 https://dev59.com/6XNA5IYBdhLWcg3wgeEd - Sam Marion
你无法获取每个线程的内存使用情况,因为内存在进程中是共享的。操作系统如何知道您是否在一个线程中分配了内存并在另一个线程中使用它?这意味着什么? - Sam Marion
那么你是在建议应该像这样进行测量: `methodToMeasure(); Process currentProcess =System.Diagnostics.Process.GetCurrentProcess(); long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;` - yomna ali
你需要找出调用方法的最佳位置。这可能很棘手,因为GC会改变结果。在我看来,关闭GC并不是一个好的度量标准,因为它将在你不再使用诊断时使用。 - Sam Marion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接