2017-08-30 9 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

私はSystem Diagnosticsクラスを使用します。ごみが収集されるかどうかによって結果が大きく異なるため、メモリ使用量を計算する際には注意が必要です。

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

私が望む方法にのみ計算を割り当てる方法はありますか?どのように私はそれをプロセスと呼ぶことができますか? –

+0

あなたの現在のやり方は、1つの方法について計算しているだけですか?ドキュメントによると、現在割り当てられているバイト数が返されます。私はテストするためにサンプルアプリケーションを実行しようとしています。 –

+0

いくつかのテストを実行した後、私は現在の方法でスレッドごとのメモリ使用量が得られないと確信しています。私は100%は可能だとは思っていませんが、多分この質問は、各スレッドが使用するCPU使用量であなたを助けることができますhttps://stackoverflow.com/questions/934497/how-can-i-get-cpu-usage-and-スレッド内のCシャープマネージドコードの使用またはブロック –

関連する問題