gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:21 24 4
gpt4 key购买 nike

我正在尝试测试我的 .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。
  • 以上哪种方法是正确的?如果没有,正确的方法是什么?
  • 也许我的期望不正确?
  • 如果可能,我想解释一下结果以及它们不同的原因。

  • 提前致谢

    最佳答案

    Which of the methods above is correct? If none, what is the correct method?



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

    If possible, I would like an explanation to the results and why they differ.



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

    I don't think book keeping of GC is relevant.



    这是我们大多数人不同意的一点。如果您想测量分配的总字节数减去开销,您需要询问有关 .net 框架的更具体的问题(因为这已经超出了 C# 的范围)。

    关于c# - 如何准确测量 C# 代码中的内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51350610/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com