【问题标题】:Process details(CPU time, memory allocated) for a method in program程序中方法的进程详细信息(CPU 时间、分配的内存)
【发布时间】:2011-10-22 21:42:50
【问题描述】:

我想计算整个程序中为特定方法分配的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

【问题讨论】:

  • 抱歉,您的问题不是很清楚。你想做什么,为什么?您几乎可以测量所有内容,但您的答案应该更具体,以便获得我们的帮助。
  • 您要使用工具还是以编程方式执行此操作?
  • 为问题添加了更多详细信息。我正在以编程方式执行此操作。
  • 不能使用分析器有什么原因吗?它们就是为这种分析而设计的。
  • 为什么你认为一个方法可以自己消耗内存?除非您只关心在该方法中声明的局部变量,否则我认为分配给方法的内存不是很有意义,我理解方法运行时的 cpu 使用情况...

标签: c# .net process


【解决方案1】:

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

如果您只想要单个线程的内存使用量,我认为您不能这样做。您必须以某种方式跟踪所有分配。

使用 Process.TotalProcessorTime 作为 CPU 时间。

【讨论】:

  • 这是否适用于垃圾收集器?当考虑 GC 时,“已用内存”的整个概念非常奇怪。
  • 在使用垃圾收集器时,我们可以考虑使用内存的 3 种不同方式:内存使用包括垃圾(将 false 传递给 GetTotalMemory);内存使用减去垃圾(将 true 传递给 GetTotalMemory);进程的内存使用,其中包括垃圾收集器未使用的空内存。对我来说,内存使用减去垃圾是最重要的衡量标准,因为它允许您根据最终结果(最终内存使用)比较算法。如果您关心数据访问的局部性(更快地重用相同的内存区域),“新”调用分配的总内存可能更重要。
  • 嗯,您确实使用了 GC.GetTotalMemory(false),那么这是否意味着您希望计算包含垃圾?
  • 我使用 false 作为参数,因为您在问题中指定了它。我自己通常不会包含垃圾,因为它不是一个准确的数字——可能有一个中间垃圾收集,所以你不会以一种确定的方式包含所有的垃圾。如果需要垃圾,则必须显式跟踪分配的内存以获得最佳结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多