2017-08-30 64 views
3

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

 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; 

回答

0

我会看看使用系统诊断类。计算内存使用量时必须小心谨慎,因为根据收集的垃圾数量,结果会发生显着变化。

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

有没有办法只为我想要的方法分配计算?我怎样才能称之为一个过程? –

+0

你确定你目前的做法是只计算一种方法吗?根据文档是返回当前分配的字节数。我将尝试运行示例应用程序进行测试。 –

+0

运行一些测试后,我确信当前的方法不会给你每个线程的内存使用量。我不是百分之百肯定这可能,但也许这个问题可以帮助你与每个线程使用CPU的使用量https://stackoverflow.com/questions/934497/how-can-i-get-cpu-usage-and- or-ram-usage-of-a-thread-in-c-sharp-managed-code –