C# 如何度量代码或进程的累积内存使用率?

C# 如何度量代码或进程的累积内存使用率?,c#,.net,performance,memory,C#,.net,Performance,Memory,我试图使用process.privateBytes和process.workingSet测量代码和进程的内存使用情况,但如果我多次运行应用程序,每次都有不同的值 每次使用~相同值的准确方法是什么?要准确测量内存消耗量,您可以使用专业的内存分析器。但是,最好的程序,如JetBrains dotMemory和Redgate ANTS并不是免费的。Process.privateBytes是一个近似值,除非有问题的代码和进程中的代码只有一个线程。Sleep()对于它生成的所有线程,值都会有所不同(取决于

我试图使用process.privateBytes和process.workingSet测量代码和进程的内存使用情况,但如果我多次运行应用程序,每次都有不同的值


每次使用~相同值的准确方法是什么?

要准确测量内存消耗量,您可以使用专业的内存分析器。但是,最好的程序,如JetBrains dotMemory和Redgate ANTS并不是免费的。

Process.privateBytes是一个近似值,除非有问题的代码和进程中的代码只有一个线程。Sleep()对于它生成的所有线程,值都会有所不同(取决于占用的内存+GC)

另请参考

如果您需要从代码(如您在评论中提到的)使用框架(它是免费的)来衡量内存使用情况,那么它就是专为此类任务设计的

var snapshot1 = dotMemoryApi.GetSnapshot();
foo.Bar(); // run your code
var allocatedSize = dotMemoryApi.GetDifference(snapshot1).GetNewObjects().SizeInBytes;
它被设计为易于与单元测试一起使用,但也可以与任何应用程序一起使用。当前EAP版本包含用于此目的的独立启动器。 问我你是否需要这个框架的帮助

有以前版本的在线文档

如果进程没有那么大,您可以假设进程需要多少内存(因为您可以查找不同数据类型的大小)。您为流程提供了哪些数据?除此之外,Visual Studio还有一个监视器,可用于在调试时监视您的应用程序。@MartinBeentjes但如果我调用任何其他外部代码,如使用反射,我如何知道在运行时创建的所有数据类型,以了解所用的数据类型?我想以编程方式使用它,我需要运行进程或代码,并在控制台中显示内存使用情况?那么你知道怎么做吗?@miloud In.NET,内存由GC管理,不受你的控制。您可能会做出有根据的猜测,但.NET应用程序无法真正准确地测量其自身的内存消耗。因此,如果不准确,他们有任何方法可以在[XXXko,yyyyko]这样的时间间隔内测量内存消耗,我使用ETW捕获GC信号,并使用perfMon捕获GC释放的内存,如果运行相同的进程,同样的东西不能每次都有相同的值