2017-08-30 11 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 –