如何准确地测量C#代码中的内存分配?

时间:2018-07-15 17:34:45

标签: c# .net-core

我正在尝试测试.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。

  1. 以上哪种方法正确?如果没有,正确的方法是什么?
  2. 也许我的期望不正确?
  3. 如果可能的话,我想解释一下结果以及它们为何不同。

预先感谢

1 个答案:

答案 0 :(得分:-3)

  

以上哪种方法是正确的?如果没有,正确的方法是什么?

据我所知,没有方法可以在标准C#领域中精确地测量分配的内存使用情况。但是,就.net库而言,它似乎已经找到了。它们都是正确的(在.net框架世界中),但是它们都测量不同的东西。


  

如果可能,我想解释一下结果以及它们为何不同。

您可以期望GC.GetAllocatedBytesForCurrentThread仅针对您的线程(即“ CurrentThread”)将每个分配的费用作为每个分配的一部分进行计数,尽管我无法找不到任何文档,所以那只是一个猜测。您可以期望GC.GetTotalMemory对每个线程以及更多线程执行此操作,尽管结果可能不像您看到的那样同步。


  

我认为GC的簿记无关紧要。

这是我们大多数人不同意的观点。如果要测量分配的总字节数减去开销,则需要提出一个关于.net框架的更具体的问题 (因为这已经超出了C#领域。