【问题标题】:How to measure the average memory consumption and peak memory of a method in C#?如何在 C# 中测量方法的平均内存消耗和峰值内存?
【发布时间】:2018-02-08 13:00:58
【问题描述】:

我写了一段代码来测量一个方法的内存消耗(平均内存和峰值内存值)。 我只是在一个线程中运行该方法并在一个循环中调用 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;

【问题讨论】:

    标签: c# memory


    【解决方案1】:

    我会考虑使用系统诊断类。计算内存使用量时必须小心,因为根据收集的垃圾,您的结果会发生巨大变化。

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

    【讨论】:

    • 有没有办法只为我想要的方法分配计算?我怎样才能把它称为一个过程?
    • 您确定您目前的做法只是针对单一方法进行计算吗?根据文档返回当前分配的字节数。我将尝试运行一个示例应用程序进行测试。
    • 运行一些测试后,我确信当前方法不会为您提供每个线程的内存使用情况。我不是 100% 确定这是可能的,但也许这个问题可以帮助您了解每个线程使用的 CPU 使用量stackoverflow.com/questions/934497/…
    • 您无法获取每个线程的内存使用情况,因为内存在进程中的所有线程之间共享。操作系统如何知道您是否在一个线程中分配内存并在另一个线程中使用它。这意味着什么?
    • 那么您是否建议应该像这样测量它:methodToMeasure(); Process currentProcess =System.Diagnostics.Process.GetCurrentProcess(); long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2019-02-21
    • 2017-10-01
    • 2017-05-28
    • 2014-03-07
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多