2010-11-08 35 views
6

Tengo una aplicación multiproceso C#, donde la lógica central se encuentra en un controlador de eventos Timer.Elapsed. El controlador de eventos contiene 2 for loops que ejecuta un máximo de n * n = 5 * 5 = 25 times.Aplicación C# - Reducir el uso de la CPU

La aplicación funciona bien en mi PC. Ejecuté VS 2010 Profiler frente a la aplicación y promedios de uso de CPU en 20%.

probador La compañía dice que en su PC este salta a entre 50% y 100% en su PC. Esto está causando problemas de rendimiento para él.

  • ¿Hay algo que pueda hacer para remediar esto?
  • ¿Qué significa realmente un alto uso de CPU?
  • ¿Podría esto afectar su PC?
  • ¿Es posible decirle a una aplicación que utilice solo X cantidad de en la CPU?

Cualquier ayuda sería apreciada.

+0

El número de veces que se ejecuta el bucle significa algo en el contexto de lo que ejecuta. Si ejecuta costosas operaciones 25 veces, eso podría ser un gran problema. Si sumas 25, no importará. – rerun

+0

¿Con qué frecuencia está disparando su temporizador? ¿Esperas a que la operación se complete antes de volver a iniciar el temporizador, o simplemente sigues pateando tus loops una y otra vez independientemente de si el anterior ha terminado? –

+0

El temporizador se ejecuta cada segundo. En el controlador de eventos del temporizador, detengo el temporizador en la primera línea de código y lo reinicio en la última línea de código. Efectivamente, esto solo crea un retraso de 1 segundo entre los eventos. El código entre iniciar y detener el temporizador, hace algunos cálculos en la memoria en un ConcurrentDictionary, que puede crecer bastante. Los cálculos son bastante simples pero se basan en grandes cantidades de datos. No ocurre interacción con la IU en este controlador de eventos, por lo tanto, no estoy usando un DispatcherTimer ni un BackgroundWorker. El ConcurrentDictionary se actualiza mediante varios eventos. – c0D3l0g1c

Respuesta

3

usted está en preguntarse y el modo de adivinanzas. Olvide el porcentaje de CPU. Lo que hacen los profesionales es averiguar por qué el programa está gastando tiempo y si es necesario.

Lo que podría hacer es simplemente ejecutar ese código en un bucle largo, y probarlo. I use this method. Las muestras de pila caerán preferentemente en las ramas pesadas del árbol de llamadas. Lo más probable es que puedas cortar algunas de esas ramas pesadas y obtener una buena aceleración.

+0

Ver mis comentarios arriba. – c0D3l0g1c

+0

@ c0D3l0g1c: esta es la cuestión del uso de la CPU. La CPU siempre se está ejecutando. Cuando no está ejecutando código real, está ejecutando el proceso inactivo. El uso es solo un promedio de ejecución de corto plazo del código real. Mientras que su proceso espera E/S, no se está ejecutando, por lo que se muestra como un uso menor. Si está crujiendo, es más alto. Tiene poco que ver con la eficiencia del código. Lo que hay que hacer es lo que dije. Básicamente, saca el plomo, encontrando ramas pesadas del árbol de llamadas que puedes podar. –

+0

¡Gracias, tiene sentido! Tu artículo de una publicación anterior es útil. – c0D3l0g1c

6
  • ejecutar el evento de temporizador con menos frecuencia
  • hacer el trabajo en un subproceso de trabajo (por lo que la interfaz de usuario es al menos sensible)
  • hacer menos trabajo en el temporizador (o hacerlo de manera más eficiente)
  • Obtenga más CPU

Supongo que realmente quiere decir la tercera viñeta, pero no podemos responder eso sin saber qué está haciendo el código; pero (sugerencias al azar sin ningún contexto):

  • vistazo a cualquier acceso colección para ver si hay un lugar para un diccionario, el hash-set, o similares cheque
  • si están haciendo grandes cantidades de IO (en particular a un DB) que podría reducirse
  • cheque si se va un montón de hilo a través de interruptores Invoke (o el equivalente en la interfaz de usuario)
+0

Ver comentarios arriba. – c0D3l0g1c

1

simplemente agregue el Thread.Sleep(1); dentro de su bucle for. esto estabiliza el uso de la CPU y restringe el uso de la CPU a la velocidad máxima.

0

Puede ser que su aplicación ejecute varios hilos. Tengo el mismo problema que ejecuta varios hilos y en cada hilo hay una actualización continua que hace que el uso de la aplicación sea del 50% al 100%.

Después de investigar el problema, acabo de introducir el retraso en el bucle continuo de la secuencia (Subproceso (100)). Esto hace que el uso de la aplicación vuelva a ser del 1% al 3%.

Cuestiones relacionadas