2012-02-13 43 views
7

me gustaría saber el uso de la CPU para un proceso específico ..Conseguir uso de la CPU de un proceso en C#

Este código

total_cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 

funciona muy bien. El número corresponde al número de "uso de CPU" en Windows 'Task Manager.

Pero la siguiente me da los números extraños ...

process_cpu = new PerformanceCounter("Process", "% Processor Time", "gta_sa"); 
var process_cpu_usage = (total_cpu_usage.NextValue()/100) * process_cpu.NextValue(); 

Como se puede ver en la captura de pantalla (en lugar de "7", que estoy recibiendo "2,9 ..").

Processes

+0

Ha intentado poner el sueño durante 1 segundo entre cada NetValue() llama. La primera llamada a NextValue() la comienza a medir, y la siguiente llamada da algunos resultados. Así que el truco es crear todos sus objetos PerformanceCounter e inmediatamente llamar a NextValue() para ellos. Luego duerma un segundo y llame a NextValue() para todos nuevamente – Mohit

+0

thx, sí llamo a NetValue() cada segundo .. –

Respuesta

11

En realidad, el Proceso \% de tiempo de procesador \ counter Instancia devuelve el% de tiempo que el proceso supervisado utiliza en% de tiempo de usuario de un solo procesador. Entonces, el límite es 100% * la cantidad de procesadores que tiene.

No parece haber una manera fácil de calcular el valor que muestra taskmgr usando los contadores de perfmon. Ver this link.

Asimismo, recuerda que el porcentaje de uso de la CPU no es un valor fijo, sino un valor calculado:

((total processor time at time T2) - (total processor time at time T1)/(T2 - T1)) 

Esto significa que los valores dependen tanto de T2 y T1, por lo que puede haber diferencias entre lo que se ve en el administrador de tareas y lo que calcula, si T2 y T1 utilizados por el Administrador de tareas son ligeramente diferentes de T2 y T1 utilizados por su programa.


Si está interesado, puedo proporcionarle algún código para recuperar este valor usando P/Invoke. Pero perderá los beneficios de los contadores de rendimiento (como la supervisión de procesos remotos).

+0

Si mi uso de CPU es 17% y process_cpu_usage es 100% ¿significa que mi proceso usa todos los 17 % ?? Y segundo problema, a veces obtengo más del 100% de process_cpu_usage, por ejemplo, 102% ... –

+0

@ MarekJavůrek ¿Qué devuelve 'process_cpu.NextValue()'? ¿Cuántas CPU y núcleos tiene en su máquina? – ken2k

+0

si mi carga de CPU es aproximadamente 15% y mi proceso usa todo 15%, entonces process_cpu.NextValue() devuelve número como 99 o 100 .. tahts por qué hago esto: var process_cpu_usage = (total_cpu_usage.NextValue()/100) * process_cpu .NextValue(); ... mi CPU es i5-2430M –

6

La división por el procesador/recuento de testigos es lo que pareció producir resultados bastante precisos al comparar con el Administrador de tareas.

Para ahorrar tiempo la gente:

// This will return the process usage as a percent of total processor utilisation. 
var processUsage = process_cpu_usage/nextValue()/Environment.ProcessorCount; 
Cuestiones relacionadas