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 –