.net 如何找到方法分配的内存量?
我想知道方法运行时分配的内存总量。到目前为止,我已经:.net 如何找到方法分配的内存量?,.net,profiling,memory-management,.net,Profiling,Memory Management,我想知道方法运行时分配的内存总量。到目前为止,我已经: GC.Collect() GC.WaitForPendingFinalizers() memStart = GC.GetTotalMemory(false) f() memEnd = GC.GetTotalMemory(false) print (memEnd - memStart) 对于简单的函数来说,这似乎已经足够好了,但是当f分配太多以至于强制收集时,结果将排除已经收集的对象。不仅如此,还无法判断是否发生了这种“溢出” 有没有一个简
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)
来进行解析,以避免分配成千上万的子字符串。但在其他情况下,这也是一个很好的工具。我一直使用性能计数器进行此类分析。不完美,但通常足够好
GC.Collect()
GC.WaitForPendingFinalizers()
这两行不会等待垃圾收集器实际完成。无论如何,在函数调用期间可能会发生垃圾收集。最好只是将性能/时间作为一种优化来衡量。我知道你说过你不想使用内存分析器,但这正是一种非常有用的情况。只需下载类似的内容,并使用14天免费试用。如果
f
分配了大量的小对象,从而导致了一个集合,并且这些对象中的许多被释放了,那么它应该可以让您对正在发生的事情有一个相当即时的了解。。。。很好,.NET内存系统运行良好,其中一个主要假设是,可以释放许多最近分配的对象。换句话说,你为什么要对分配器和垃圾收集器进行二次猜测?@Damien:我没有试图二次猜测或以任何方式影响GC。我只是想要一些关于给定时间段内分配/收集的统计数据,即一个轻量级分析类。@petebu-我更想看你的最后一段,您考虑重新编写框架功能以避免分配这些子字符串。@Damien:但选择是在大量短期的小分配和完全不分配(成本很低)之间进行。ParseInt和Int32.Parse一样可读,实现非常简单,永远不会改变(零维护)。我并不反对.NET内存系统,但在这种情况下,分配似乎是免费的。换句话说,如果ParseInt是BCL的一部分,这将是一个很简单的问题。@petebu-当你找到你喜欢的分析器时,你可能会惊讶于Int32.Parse
和String.Substring
的相对效率。如果您建议的ParseInt
是BCL的一部分,它可能必须处理与Int32.Parse
相同的可能性范围,例如不同的文化背景、numberstyle
和IFormatProvider
选项。