2010-03-09 13 views
7

Me han preguntado cómo saber cuánta memoria y CPU está usando mi programa, y ​​me han remitido a Contadores de rendimiento. Sin embargo, cuando miro la documentación, comienza diciéndome acerca de proporcionar datos del consumidor creando un manifiesto para mi aplicación, y mis ojos se vuelven vidriosos. Es agradable que una herramienta de propósito general esté ahí, supongo, pero todo lo que quería era un conjunto de funciones que me dijera cuánta memoria y CPU está usando mi programa.¿Los contadores de rendimiento son la herramienta adecuada para mi trabajo? Si es así, ¿cómo los uso?

¿Los contadores de rendimiento son la herramienta adecuada para mi trabajo? Si es así, ¿cómo los uso? Realmente no quiero tener que configurar nada fuera de mi aplicación C#.

NOTA: No estoy buscando una aplicación de creación de perfiles de terceros, necesito que mi aplicación muestre la memoria y los datos de la CPU.

ACTUALIZACIÓN: he eliminado el tiempo en las funciones, ya que parecía estar confundiendo el asunto.

+0

"No estoy buscando una aplicación de creación de perfiles de terceros, necesito tener los datos dentro de mi aplicación" - eso no tiene sentido para mí? –

+0

Estás hablando de un generador de perfiles. Use el que está integrado en Visual Studio (si tiene esa versión) o use algo como memprofiler. –

+0

@Mitch: ¿está la pregunta más clara ahora? – Simon

Respuesta

1

Los contadores de rendimiento no le dirán cuánto tiempo dedica su aplicación en una función. Para eso puedes usar algún tipo de clase de temporizador que comiences al principio de la función y te detengas al final.

+0

No es tan simple como agregar un DateTime start = DateTime.Now; y DateTime end = DateTime.Now; al principio y al final de la función? O antes y después de que se ejecute. Entonces simplemente haga TimeSpan timespent = end - start; y hacer un poco de registro o algo con el valor. – Alxandr

+0

@shoosh: OK, ¿qué tal el resto? – Simon

+0

@Alxandr: la precisión de milisegundos no es suficiente, y obtener una mejor resolución con Stopwatch lleva tanto tiempo que los valores están sesgados. – Simon

3

Puede utilizar perfmon fuera de la caja para controlar el uso de CPU, memoria y disco, así como muchos contadores de rendimiento específicos de .NET. perfmon viene con ventanas.

El eye-glazer es obligatorio solo si desea escribir su propio perfmon, o si desea ofrecer sus propios contadores de rendimiento. Lo último sería interesante solo si los usuarios tuvieran que controlar este valor (por ejemplo, está desarrollando una aplicación de servidor y sus usuarios deben asegurarse de que no se rechacen más del 10% de las conexiones debido a la fase lunar no válida).

Para determinar cuánto tiempo pasa en determinadas funciones, utilice un generador de perfiles.

API Contador

El rendimiento permitiría monitorizar los datos junto con los contadores de rendimiento existentes (que podría decirle por ejemplo, que la función Foo se pone muy lento todas las noches después de las 11, ya algún otro proceso se agitaba el disco), y el monitor puede ejecutarse como un servicio y producir archivos de registro para su posterior análisis.

Debe averiguar si estos beneficios valen la pena el problema adicional de los contadores de rendimiento, o si está mejor con un sistema de registro.

Hay bastantes muestras out there que pueden hacer que sea más fácil para usted. Sin embargo, vale la pena entender la arquitectura y la terminología "oficial". Normalmente, MS API do requiere mucha lectura y busca un buen código de contenedor, eso no significa que siempre sean dolorosos.

+0

I effectivedly quiero escribir mi propio perfmon, pero solo para mi aplicación. Necesita mostrar su propio uso de CPU y memoria. – Simon

+0

@Simon: He actualizado la respuesta. – peterchen

+0

Gracias: el proyecto SystemMonitor en particular parece una buena pista. – Simon

0

la cantidad de tiempo que se gasta en la función

para ello es necesario un generador de perfiles (como el que se incluye en las ediciones más avanzadas de Visual Studio). Esto le dará detalles de cuántas veces se llama a cada método (con o sin funciones a las que llama).

Detalle esencial para identificar los cuellos de botella.

CPU

Los contadores proceso segundos de CPU de rendimiento total (o columnas en Administrador de tareas o el Explorador de procesos) le dará esto. En la práctica, es posible que necesite más detalles (kernel vs. tiempo de usuario) que también están disponibles.

memoria

Ésta es la parte difícil .... "memoria" puede significar: espacio asignado dirección virtual, cometido espacio de direcciones virtuales, conjunto de trabajo, el pico de trabajo conjunto, memoria privada, ..

Probablemente necesite pasar algún tiempo con las partes internas de Windows o una referencia similar para comprender cómo son diferentes y qué significan antes de comenzar cualquier análisis real.

+0

¿Qué debo hacer para encontrar los "contadores de rendimiento de segundos de CPU totales del proceso"? – Simon

+0

@Simon: En proceso en perfmon. – Richard

+0

@Richard: Quiero decir, ¿cómo lo usaría desde mi aplicación? – Simon

3

Suponiendo una aplicación de instancia única para (conjunto de trabajo de proceso) uso de la CPU y de memoria que podría hacer algo como lo siguiente:

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); 
} 

Para los Potencia del uso de la CPU contrarrestar la primera llamada a NextValue devuelve 0 lo que sólo el segunda llamada se usa para mostrar el valor. El uso informado es la suma de todos los procesadores de máquina, por lo que el promedio se calcula antes de mostrarse.

2

Para obtener información simple, echar un vistazo a estos valores desde dentro de su código C#, a continuación, elegir qué es lo más importante para usted:

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

PrivateMemorySize es el total de bytes privados (administrado y no administrado combinado) para su proceso . GetTotalMemory le proporciona el uso total de la memoria administrada para su aplicación, al pasar true forzará un GC antes de obtener el valor.

+0

Se ve bien, ¿qué hay de la CPU? – Simon

+0

No sé si hay algo para el uso actual e instantáneo de la CPU, pero TotalProcessorTime le dará la cantidad total de tiempo que su proceso ha utilizado. Si lo que busca es un informe instantáneo del uso de la CPU, tendrá que mirar los Contadores de rendimiento o WMI. –

Cuestiones relacionadas