Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何找到方法分配的内存量?_.net_Profiling_Memory Management - Fatal编程技术网

.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
选项。