【问题标题】:Find memory consumed by simple console C# program查找简单控制台 C# 程序消耗的内存
【发布时间】:2023-03-25 00:18:01
【问题描述】:

我需要找出简单的控制台 C# 程序消耗的时间和内存。

.Net 框架有秒表实用程序来完成第一个任务,

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Process process = Process.GetCurrentProcess();
        long memoryUsedInBytes = process.WorkingSet64;

        //do something            

        sw.Stop();
        Console.WriteLine(sw.Elapsed.Milliseconds + "ms elapsed.\n" + memoryUsedInBytes/1000 + " KB consumed");

我们在框架中是否有像这样简单的东西来查找简单控制台程序消耗的内存,而不使用高级诊断技术。

编辑:附加内存使用代码,如下所示,由 Habib 回答。

【问题讨论】:

  • @NahumLitvin:根据您对内存使用的定义,这给出了一个可能代表或可能不代表“内存消耗”的数字。
  • 这不是衡量消耗的时间,而是经过的时间。如果另一个更高优先级的进程同时运行(并且可用的内核不足),秒表仍会运行,但您的程序不会。见性能。计数器答案,也可以测量消耗的时间。

标签: c# c++ .net frameworks system.diagnostics


【解决方案1】:

您可以获取当前的process,然后使用属性WorkingSet64 可以获取以字节为单位的大小。

Process.WorkingSet64 Property - MSDN

获取为关联的分配的物理内存量 过程。

还有

此属性可用于监控计算机上的内存使用情况 32 位处理器或 64 位处理器。属性值为 相当于进程的工作集性能计数器。

Process process = System.Diagnostics.Process.GetCurrentProcess();
long memoryUsedInBytes = process.WorkingSet64;

【讨论】:

  • 使用 Process.GetCurrentProcess() 和 GC.GetTotalMemory() 在任何特定的代码行给出不同的值。并且 GetTotalMemory 总是返回较少的值。
  • 对于示例运行,Process.GetCurrentProcess() 返回 8.3MB,而 GC.GetTotalMemory() 返回 365KB。
  • 这是否意味着与托管代码在特定时间分配的总内存相比,为进程分配的物理内存量包含更多项目?
  • @autrevo,是的,这是正确的,Gc.GetTotalMemory 也返回 当前在托管内存中分配的字节数的最佳近似值
【解决方案2】:

.NET 进程公开了一组相当丰富的性能计数器。您可以使用 Windows 的性能监视器将计数器添加到图形中,可以是通用内存计数器(分配的字节等)或 .NET 特定的计数器,例如每次 GC 生成中的字节等:

【讨论】:

  • 在 win xp 上定位 .NET CLR 内存计数器时遇到困难。性能计数器确实为大型应用程序提供了详细的图形分析,对于简单的应用程序似乎更耗时:-) +1
【解决方案3】:

【讨论】:

  • 根据上面发布的超链接,“特别是,GC.GetTotalMemory() 将为您提供托管代码在特定时间的总内存分配。”为此 +1
  • Simon,使用 Process.GetCurrentProcess() 和 GC.GetTotalMemory() 在任何特定的代码行给出不同的值。 GetTotalMemory 总是返回较少的值。对于示例运行 Process.GetCurrentProcess() 返回 8.3MB,而 GC.GetTotalMemory() 返回 365KB。这是否意味着与托管代码在特定时间分配的总内存相比,为进程分配的物理内存量包括更多项目?
猜你喜欢
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多