我想知道一個方法運行時分配的內存總量。到目前爲止,我有:如何查找方法分配的內存量?
GC.Collect()
GC.WaitForPendingFinalizers()
memStart = GC.GetTotalMemory(false)
f()
memEnd = GC.GetTotalMemory(false)
print (memEnd - memStart)
這似乎是工作不夠好,簡單的功能,但是當f
分配這麼多,這迫使一個集合,那麼結果排除了已收集的對象。不僅如此,沒有辦法說明這種「溢出」發生了。
有沒有簡單的方法來做到這一點?不購買/安裝/配置內存分析器?分配器/收集器的秒錶就像是一個理想的東西。所以,我可以這樣做:
sw = new GCStopwatch()
sw.Start()
f()
sw.Stop()
print sw.TotalBytesAllocated
print sw.NumberOfCollections
// etc
我想要這個,所以我可以找出多少壓力的方法是在垃圾收集器推杆。我的代碼是從一個固定長度的字符串中讀取數字,並使用Int32.Parse(s.Substring(4,6))
的大量調用,我考慮通過引入ParseInt(String s, int startIndex, int length)
來避免分配數以萬計的子字符串,從而在原地進行解析。但這也是在其他場景中的一個很好的工具。
如果'f'分配了很多小對象,從而導致了一個集合,並且很多這些對象被釋放......好 - .NET內存系統運行良好,並且有一個主要假設 - 很多最近分配的對象可以被釋放。換句話說,你爲什麼試圖猜測分配器和垃圾收集器? – 2011-02-24 08:27:40
@Damien:我不想以任何方式猜測或影響GC。我只想在一定時期內收集一些關於分配/收集的統計數據,即。一個輕量級的剖析類。 – petebu 2011-02-24 13:10:42
@petebu - 我更關注你的最後一段,你正在考慮重寫框架功能以避免分配這些子字符串。 – 2011-02-24 13:47:36