我正在尝试测试.Net Core代码的一部分分配了多少内存,并且我想出了两种选择,两者都给我带来困惑的答案。
第一次尝试:
var before = GC.GetTotalMemory(false);
var temp = new char[1];
var total = GC.GetTotalMemory(false) - before;
Console.WriteLine($"Memory allocated in bytes: {total}");
对于1、100、500和1000,我得到0。对于10,000,我得到20048。
第二次尝试:
var before = GC.GetAllocatedBytesForCurrentThread();
var temp = new char[1];
var total = GC.GetAllocatedBytesForCurrentThread() - before;
Console.WriteLine($"Memory allocated in bytes: {total}");
对于1,100、500、1000和10,000,我分别得到32、224、1024、2024和20024。
我期望的是: 2 *数组长度,因为sizeof(char)为2。
预先感谢
答案 0 :(得分:-3)
以上哪种方法是正确的?如果没有,正确的方法是什么?
据我所知,没有方法可以在标准C#领域中精确地测量分配的内存使用情况。但是,就.net库而言,它似乎已经找到了。它们都是正确的(在.net框架世界中),但是它们都测量不同的东西。
如果可能,我想解释一下结果以及它们为何不同。
您可以期望GC.GetAllocatedBytesForCurrentThread
仅针对您的线程(即“ CurrentThread”)将每个分配的费用作为每个分配的一部分进行计数,尽管我无法找不到任何文档,所以那只是一个猜测。您可以期望GC.GetTotalMemory
对每个线程以及更多线程执行此操作,尽管结果可能不像您看到的那样同步。
我认为GC的簿记无关紧要。
这是我们大多数人不同意的观点。如果要测量分配的总字节数减去开销,则需要提出一个关于.net框架的更具体的问题 (因为这已经超出了C#领域。