2010-03-09 47 views
7

我已经被问及如何找出我的程序使用了多少内存和CPU,并且我被提到了性能计数器。但是,当我查看文档时,它首先告诉我通过为我的应用程序创建清单来提供消费者数据,并且我的眼睛掠过。我想,这样的通用工具在那里很好,但我想要的只是一组函数,它们会告诉我我的程序使用了多少内存和CPU。性能是否适合我的工作?如果是这样,我该如何使用它们?

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

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

更新:我已经删除了函数中的时间,因为它似乎混淆了这个问题。

+0

“我不是在寻找第三方分析应用程序,我需要在我的应用程序中有数据” - 这对我没有意义吗? – 2010-03-09 14:48:58

+0

您正在讨论一个分析器。要么使用Visual Studio中内置的那个(如果你有这个版本),要么使用像memprofiler这样的东西。 – 2010-03-09 14:50:30

+0

@Mitch:现在问题更清楚了吗? – Simon 2010-03-09 14:59:06

回答

1

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

+0

是不是像添加DateTime start = DateTime.Now一样简单;和DateTime结束= DateTime.Now;在函数的开始和结束?或者在它运行之前和之后。然后做TimeSpan timespent = end - start;并做一些日志记录或有价值的东西。 – Alxandr 2010-03-09 14:56:32

+0

@shoosh:好的,其余的呢? – Simon 2010-03-09 14:59:52

+0

@Alxandr:毫秒准确度是不够的,使用秒表获得更好的分辨率需要很长的时间,以致数值出现偏差。 – Simon 2010-03-10 09:16:16

3

您可以使用perfmon开箱即用来监视CPU,内存和磁盘使用情况以及许多.NET特定的性能计数器。 perfmon自带窗户。

只有当你想写自己的perfmon,或者如果你想提供你自己的性能计数器,眼睛釉是必需的。只有当你的用户需要监视这个值时(例如你正在开发一个服务器应用程序,并且你的用户需要确保由于月相无效而拒绝的连接数不超过10%),后者才会很有趣。

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


性能计数器API将允许你一起监测数据与现有的性能计数器(这可能会告诉你,例如该功能Foo 11后每天晚上很慢变,因为一些其他进程颠簸盘),和监视器可以作为服务运行并生成日志文件供以后分析。

您必须弄清楚这些好处是否值得性能计数器的额外麻烦,或者如果您最好使用日志记录系统。

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

+0

我有效地想写我自己的perfmon,但只适用于我的应用程序。它需要显示自己的CPU和内存使用情况。 – Simon 2010-03-09 15:07:26

+0

@Simon:我已经更新了答案。 – peterchen 2010-03-09 15:29:32

+0

谢谢 - 特别是SystemMonitor项目看起来很不错。 – Simon 2010-03-09 16:20:29

0

是多少时间在功能

花费为此,您需要一个分析器(如Visual Studio中的更先进的版本包括一个)。这会给你详细说明每个方法被调用的次数(有或没有它调用的函数)。

识别瓶颈的基本细节。

CPU

总过程CPU-秒性能计数器(或列在任务管理或处理资源管理器)将这个给你。在实践中,您可能需要更多可用的细节(内核与用户时间)。

内存

这是困难的部分......“记忆”可以指:分配的虚拟地址空间,致力于虚拟地址空间,工作集,高峰工作组,专用内存,..

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

+0

我将如何去寻找“总进程CPU秒性能计数器”? – Simon 2010-03-09 14:59:36

+0

@Simon:在perfmon下进行。 – Richard 2010-03-09 16:38:18

+0

@Richard:我的意思是,我将如何从我的应用程序中使用它? – Simon 2010-03-09 17:00:31

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,所以只有第二次调用用于显示值。报告的使用量是所有机器处理器的总和,因此在显示之前计算平均值。

2

对于简单的信息,看看从你的C#代码中的这些值,然后选择什么是你最相关的:

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

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

+0

看起来不错 - CPU呢? – Simon 2010-03-10 09:14:48

+0

我不知道是否有任何关于当前即时CPU使用情况的信息,但TotalProcessorTime会为您提供整个Process的使用时间。如果您所追求的是CPU使用率的即时报告,则必须查看性能计数器或WMI。 – 2010-03-10 11:32:51

相关问题