[英]How to accurately measure memory allocation in C# code?
我正在嘗試測試.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。
提前致謝
上面哪種方法是正確的? 如果沒有,正確的方法是什么?
據我所知,沒有任何方法可以精確地測量標准C#領域中分配的內存使用情況。 但是,就.net庫而言,它似乎已經找到了。 它們都正確(在.net框架世界中),但是它們都測量不同的事物。
如果可能的話,我想解釋一下結果以及它們為何不同。
您可以期望GC.GetAllocatedBytesForCurrentThread
您的線程(即“ CurrentThread”)計數每個分配作為每個分配的一部分的費用,盡管我找不到任何文檔,所以這只是一個猜猜 。 您可以期望GC.GetTotalMemory
可以對每個線程以及更多線程執行此操作,盡管結果可能不像您看到的那樣同步。
我認為GC的簿記無關緊要。
這是我們大多數人不同意的觀點。 如果要測量分配的總字節數減去開銷 ,則需要詢問有關.net框架的更具體的問題(因為這已經超出C#領域)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.