我想知道方法运行时分配的内存总量。到目前为止,我有:
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)
来进行就地解析,以避免分配数万个子字符串。但这也是其他场景中的一个很好的工具。
答案 0 :(得分:0)
我一直使用性能计数器进行这类分析。不完美但通常足够好。
GC.Collect()
GC.WaitForPendingFinalizers()
这两行不会等待垃圾收集器实际完成。无论如何,在你的函数调用期间可能会发生垃圾收集。将性能/时间作为优化来衡量可能会更好。
答案 1 :(得分:0)
我知道你说你不想使用内存分析器,但这正是一种有用的情况。只需下载ANTS Memory Profiler之类的内容,并使用14天免费试用版。它应该能够让你即时了解正在发生的事情。