我被问到如何找出我的程序使用了多少内存和CPU,我已经被提到性能计数器了。但是,当我查看文档时,它首先告诉我通过为我的应用程序创建清单来提供消费者数据,然后我睁大眼睛。我想这样的通用工具很好,但我想要的只是一组函数,可以告诉我程序正在使用多少内存和CPU。
性能计数器是否适合我的工作?如果是这样,我该如何使用它们?我真的不想在我的C#应用程序之外设置任何东西。
注意:我不是在寻找第三方分析应用程序,我需要通过我的应用程序显示内存和CPU数据。
更新:我已经删除了函数中的时间,因为它似乎让人感到困惑。
答案 0 :(得分:3)
您可以使用开箱即用的perfmon
来监控CPU,内存和磁盘使用情况以及许多特定于.NET的性能计数器。 perfmon配有窗户。
只有当您想要编写自己的perfmon,或者想要提供自己的性能指示器时,才需要使用eye-glazer。只有当您的用户需要监控此值时,后者才会很有趣(例如,您正在开发服务器应用程序,并且您的用户需要确保由于月相无效而拒绝超过10%的连接)。
要确定您在某些功能上花费的时间,请使用分析器。
性能计数器API允许您与现有性能计数器一起监视数据(这可能会告诉您,例如,函数Foo
在11之后每晚都变得很慢,因为其他一些进程正在颠覆磁盘),并且监视器可以作为服务运行并生成日志文件以供以后分析。
您必须弄清楚这些好处是否值得性能计数器的额外麻烦,或者您是否更适合使用日志记录系统。
有一些样本out there可能会让您更轻松。但是,理解架构和“官方”术语仍然是值得的。通常,MS API的做需要大量阅读并寻找一些好的包装代码,这并不意味着它们总是很痛苦。
答案 1 :(得分: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使用率perf计数器,对NextValue
的第一次调用返回0,因此仅使用第二次调用来显示该值。报告的用法是所有机器处理器的总和,因此在显示之前计算平均值。
答案 2 :(得分: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。
答案 3 :(得分:1)
性能计数器不会告诉您应用程序在函数中花费的时间。为此你可以使用某种类型的计时器类,它从函数的开头开始并在结束时停止。
答案 4 :(得分:0)
花在功能上的时间
为此,您需要一个分析器(例如Visual Studio的更高级版本中包含的分析器)。这将为您提供每个方法被调用的次数的详细信息(有或没有调用的函数)。
识别瓶颈的基本细节。
CPU
总进程CPU-seconds性能计数器(或任务管理器或Process Explorer中的列)将为您提供此功能。在实践中,您可能需要更多可用的详细信息(内核与用户时间)。
记忆
这是困难的部分....“内存”可能意味着:分配的虚拟地址空间,提交的虚拟地址空间,工作集,峰值工作集,私有内存,......
您可能需要花一些时间使用Windows内部或类似的参考,以便在开始任何实际分析之前了解它们的不同之处和含义。