7

我被问到如何找出我的程序正在使用多少内存和 CPU,并且我被提到了性能计数器。然而,当我查看文档时,它首先告诉我通过为我的应用程序创建清单来提供消费者数据,我的眼睛呆滞了。我想,有这样一个通用工具很好,但我想要的只是一组函数,它们可以告诉我我的程序使用了多少内存和 CPU。

性能计数器是否适合我的工作?如果是这样,我该如何使用它们?我真的不想在我的 C# 应用程序之外设置任何东西。

注意:我不是在寻找第三方分析应用程序,我需要让我的应用程序显示内存和 CPU 数据。

更新:我已经删除了函数中的时间,因为这似乎使事情变得混乱。

4

5 回答 5

3

假设一个用于 CPU 使用率和内存(进程工作集)的单实例应用程序,您可以执行以下操作:

public static void Main(string[] args)
{
    string processName = Process.GetCurrentProcess().ProcessName;
    int processorCount = Environment.ProcessorCount;

    // Simulate process usage
    for (int i = 0; i < processorCount * 2; i++)
    {
        var t = new Thread(() =>
            {
                while (true) { Console.WriteLine("Busy..."); }
            });

        t.IsBackground = true;
        t.Start();
    }

    var cpu = new PerformanceCounter("Process", "% Processor Time");
    cpu.InstanceName = processName;
    cpu.NextValue();

    var ram = new PerformanceCounter("Process", "Working Set");
    ram.InstanceName = processName;

    float memUsage = (ram.NextValue() / 1024) / 1024;
    Console.WriteLine("Memory Usage: {0}MB", memUsage);

    float cpuUsage = cpu.NextValue() / (float)processorCount;
    Console.WriteLine("CPU Usage: {0}%", cpuUsage);
}

对于 CPU 使用性能计数器,第一次调用NextValue返回 0,因此只有第二次调用用于显示该值。报告的使用情况是所有机器处理器的总和,因此在显示之前计算平均值。

于 2010-03-09T16:38:09.500 回答
3

您可以perfmon开箱即用地监控 CPU、内存和磁盘使用情况以及许多 .NET 特定的性能计数器。perfmon 带有 Windows。

仅当您想编写自己的 perfmon 或想提供自己的性能计数器时,才需要 eye-glazer。仅当您的用户需要监视此值时(例如,您正在开发服务器应用程序并且您的用户需要确保不超过 10% 的连接因无效月相而被拒绝),后者才会很有趣。

要确定您在某些功能上花费了多少时间,请使用分析器。


性能计数器 API 将允许您与现有的性能计数器一起监视数据(这可能会告诉您,例如,该功能Foo在每天晚上 11 点之后变得非常慢,因为其他一些进程正在破坏磁盘),并且监视器可以作为服务运行并且生成日志文件以供以后分析。

您必须弄清楚这些好处是否值得为性能计数器带来额外的麻烦,或者您是否更适合使用日志系统。

有相当多的样本可能会让你更容易。但是,了解架构和“官方”术语仍然是值得的。通常,MS API确实需要大量阅读和寻找一些好的包装代码,这并不意味着它们总是很痛苦。

于 2010-03-09T14:51:54.593 回答
2

有关简单信息,请查看 C# 代码中的这些值,然后选择与您最相关的值:

System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime
System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64
System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64
System.GC.GetTotalMemory(假)

PrivateMemorySize 是您的进程的总私有字节(托管和非托管组合)。GetTotalMemory 为您提供应用程序的总托管内存使用量,传递 true 将在获取值之前强制进行 GC。

于 2010-03-09T16:44:52.260 回答
1

性能计数器不会告诉您应用程序在函数中花费了多少时间。为此,您可以使用某种计时器类,该类在函数开头开始并在结尾处停止。

于 2010-03-09T14:49:26.883 回答
0

它在功能上花费了多少时间

为此,您需要一个分析器(例如包含在 Visual Studio 更高级版本中的分析器)。这将为您提供每个方法被调用多少次的详细信息(有或没有它调用的函数)。

识别瓶颈的基本细节。

中央处理器

总进程 CPU 秒性能计数器(或任务管理器或进程资源管理器中的列)将为您提供此信息。在实践中,您可能需要更多可用的详细信息(内核与用户时间)。

记忆

这是困难的部分......“内存”可以意味着:分配的虚拟地址空间,提交的虚拟地址空间,工作集,峰值工作集,私有内存,......

在开始任何实际分析之前,您可能需要花一些时间了解 Windows 内部结构或类似的参考资料,以了解它们有何不同以及它们的含义。

于 2010-03-09T14:54:35.033 回答