我写了一段代码来测量一个方法的内存消耗(平均内存和峰值内存值)。我只是在一个线程中运行该方法,并调用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;
`methodToMeasure(); Process currentProcess =System.Diagnostics.Process.GetCurrentProcess(); long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;`
- yomna ali