2011-02-24 62 views
1

我想知道一個方法運行時分配的內存總量。到目前爲止,我有:如何查找方法分配的內存量?

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)來避免分配數以萬計的子字符串,從而在原地進行解析。但這也是在其他場景中的一個很好的工具。

+1

如果'f'分配了很多小對象,從而導致了一個集合,並且很多這些對象被釋放......好 - .NET內存系統運行良好,並且有一個主要假設 - 很多最近分配的對象可以被釋放。換句話說,你爲什麼試圖猜測分配器和垃圾收集器? – 2011-02-24 08:27:40

+0

@Damien:我不想以任何方式猜測或影響GC。我只想在一定時期內收集一些關於分配/收集的統計數據,即。一個輕量級的剖析類。 – petebu 2011-02-24 13:10:42

+0

@petebu - 我更關注你的最後一段,你正在考慮重寫框架功能以避免分配這些子字符串。 – 2011-02-24 13:47:36

回答

0

我一直使用這些分析的性能計數器。不完美,但通常足夠好。

GC.Collect() 
GC.WaitForPendingFinalizers() 

這兩行不會等待垃圾收集器實際完成。無論如何,在函數調用期間可能會發生垃圾回收。將性能/時間作爲優化來衡量可能會更好。

0

我知道你說過你不想使用內存分析器,但這正是一種有用的情況。只需下載ANTS Memory Profiler之類的東西,並使用14天的免費試用版即可。它應該給你一個相當即時的情況。