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;
有沒有辦法只爲我想要的方法分配計算?我怎樣才能稱之爲一個過程? –
你確定你目前的做法是隻計算一種方法嗎?根據文檔是返回當前分配的字節數。我將嘗試運行示例應用程序進行測試。 –
運行一些測試後,我確信當前的方法不會給你每個線程的內存使用量。我不是百分之百肯定這可能,但也許這個問題可以幫助你與每個線程使用CPU的使用量https://stackoverflow.com/questions/934497/how-can-i-get-cpu-usage-and- or-ram-usage-of-a-thread-in-c-sharp-managed-code –