程序中一个方法的处理细节(CPU时间,内存分配)

3
我想计算整个程序中特定方法的CPU时间和内存分配情况。我已经能够获取整个程序的CPU时间和内存信息。如何获取特定方法的详细信息呢?
同时,如何获取程序从辅助存储器中读取值/信息时所做的磁盘访问。
我尝试创建线程并使方法在创建的线程上运行,但它没有起作用。它只提供了整个过程的信息,而我需要的是特定方法的信息。
添加更多细节,希望这有助于理解问题。 好的,我正在编写C#代码。
public class Program
{
    public static void Main(string[] args)
    {
        **checkPoint_1_start**            
        //
        // Some code here
        //
        **checkPoint_2_start**

        calling_Method();

        **checkPoint_2_end**
        //
        // Some code here
        //

        **checkPoint_1_end**
    }

    public void calling_Method()
    {
        //
        //  Code of this method is very long and contains many variables.
        //  
    }
}

我能够找到从checkPoint_1_start到checkPoint_1_end使用的内存。我想知道如何仅找到在checkPoint_2_start和checkPoint_2_end之间使用的内存。
我使用以下内容来查看内存使用情况,这是从checkPoint_1_start到checkPoint_1_end整个过程的使用情况。如何获取在checkPoint_2_start和checkPoint_2_end之间使用的内存。
私有内存:System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 / 1024 工作集内存:System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 / 1024 已分配内存:GC.GetTotalMemory(false) / 1024

抱歉,你的问题不是很清楚。你想要做什么,为什么要这样做?你可以测量几乎任何东西,但你的回答应该更具体,才能得到我们的帮助。 - dknaack
你想使用工具还是编程的方式来完成这个任务? - CodesInChaos
在问题中添加了更多细节。我正在以编程方式实现这个。 - user1008983
1
你为什么不能使用性能分析器呢?它们专门用于这种分析。 - svick
1
你为什么认为一个方法可以单独消耗内存?除非你只关心该方法内声明的局部变量,否则我认为分配给方法的内存并不是很有意义,当方法运行时CPU使用率我能理解... - Davide Piras
1个回答

0

在checkPoint_2_start和checkPoint_2_end处使用GC.GetTotalMemory(false)(或任何其他您需要的度量函数)。这两个检查点之间使用的额外内存量是在checkPoint_2_end返回的值减去在checkPoint_2_start返回的值。

如果您只想要单个线程的内存使用情况,我认为您无法做到。您必须以某种方式跟踪所有分配。

使用Process.TotalProcessorTime获取CPU时间。


这个程序会和Garbage Collector很好地协同工作吗?在考虑到GC的时候,“已使用内存”的整个概念显得相当奇怪。 - luiscubal
当使用垃圾回收器时,我们可以以3种不同的方式考虑已使用的内存:包括垃圾的内存使用(将false传递给GetTotalMemory);减去垃圾的内存使用(将true传递给GetTotalMemory);进程的内存使用,其中包括垃圾回收器未使用的空闲内存。对我来说,减去垃圾的内存使用是最重要的度量标准,因为它允许您根据最终结果(最终内存使用)比较算法。如果您关心数据访问的局部性(重用相同的内存区域更快),则由“new”调用分配的总内存可能更重要。 - Frank Hileman
你使用了GC.GetTotalMemory(false),那么这是否意味着你想要计算包括垃圾的内存? - luiscubal
我使用false作为参数,因为你在问题中指定了它。通常我不会包含垃圾,因为它不是一个准确的数字--可能有一个中间的垃圾收集,所以你不能得到所有垃圾以一种确定的方式。如果你需要垃圾,你必须显式地跟踪分配的内存以获得最佳结果。 - Frank Hileman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接