c# - C#中如何衡量一个方法的平均内存消耗和峰值内存?

标签 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;

最佳答案

我会考虑使用系统诊断类。计算内存使用量时必须小心,因为根据收集的垃圾不同,结果会有很大差异。

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

关于c# - C#中如何衡量一个方法的平均内存消耗和峰值内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45966755/

相关文章:

c# - 如何重新包装 Linq 表达式树

c# - 为什么 WebResponse 在读取 twitter firehose 流时永远不会结束?

c# - 自动映射器、复杂属性和继承

c# - ASP.NET "Sessions Timed Out"计数器 (perfmon.exe)

c++ - 复制具有巨大数组成员的类时是否使用指针?

c# - 如何使用 Log4net 将 Guid 插入数据库?

c# - 如何使用 Microsoft Graph API 在当前用户不是组织者的情况下创建事件

javascript - 如果我只在数组中设置一个高索引,它会浪费内存吗?

python - NumPy 张量点内存错误

c - 如何将字节内存从内核模块映射到用户空间应用程序?