Aquí podría ser tu PUBLICIDAD


¿Cómo se puede acelerar un EXE de línea de comandos de larga ejecución para evitar vincular la CPU?

votos
4

Tengo un EXE de línea de comandos escrito en C #. Es un analizador de registros que muele a través de varios GB de archivos de registro cada noche.

Se fija el procesador al 100% durante bastante tiempo. No es ideal.

¿Cómo podría estrangular la aplicación? Puede tomar todo el tiempo que quiera, pero prefiero usar menos de la CPU total.

¿Existe algún método o teoría de codificación para hacer que un EXE se ralentice y tome menos CPU? No puedo hacer nada en el entorno que se ejecuta (como cambiar la prioridad del proceso), por lo que cualquier cambio debe estar dentro del código de la aplicación.

Publicado el 12/03/2009 a las 21:20
fuente por usuario Deane
En otros idiomas...        العربية       

6 respuestas

votos
8

Prueba esto:

using System.Diagnostics;

Process myProc = Process.GetCurrentProcess();
myProc.PriorityClass = ProcessPriorityClass.BelowNormal;

Si eso no es lo suficientemente bajo, hay un ProcessPriorityClass.Idle

MSDN Link 1
MSDN Link 2

Respondida el 12/03/2009 a las 09:25
fuente por usuario St. John Johnson


Aquí podría ser tu PUBLICIDAD


votos
6

También puede introducir un Sueño lento en el bucle principal que vincula el procesador.

Por ejemplo, esto se hace a menudo con bucles de juego: llamar Thread.CurrentThread.Sleep(1);una vez por cuadro hará que la mayoría de los juegos usen 100% de cpu para usar 1-2% de cpu, y aún así permitir un acceso razonable.

----- Editar ------

Hay ventajas potenciales de dormir por sobre la reducción de la prioridad del proceso o hilo. Los dos principales son:

  • Dormir le permite tener más control sobre la cantidad de tiempo de procesador que abandona. Si reduce su prioridad y hay otros procesos que consumen CPU, puede renunciar a más tiempo de procesador de lo que desea. [Esta es la razón por la que tampoco hice Sleep (0), ya que eso no siempre renunciará al tiempo del procesador, aunque sí lo hará. Lo he hecho en sistemas integrados con mayor capacidad para forzar menos uso del procesador.]
  • Si su objetivo es reducir el uso total de su CPU, disminuir la prioridad de su proceso no ayudará si no se está ejecutando nada más. Seguirás comiendo 100% de CPU. Esto podría ser útil si está tratando de mantener su consumo de energía (ahorrar costos de energía) o tratar de mantener su generación de calor más baja, dependiendo de la arquitectura de su sistema.

----- Del original -----

Para otras aplicaciones de estilos (UI), otra opción es refactorizar su rutina para que no sea un error, dividir el procesamiento en secciones y procesarlo en bloques en una llamada suscribiéndose a algo como Application.OnApplicationIdle. Esto puede permitir que su UI se mantenga un poco receptiva, ya que se ejecutará de manera acelerada.

Si se trata de una rutina matemática, y está haciendo una gran cantidad de cálculos, entonces podría ser mejor reducir la prioridad de la secuencia y permitirle usar la mayor cantidad de CPU disponible.

Respondida el 12/03/2009 a las 09:26
fuente por usuario Reed Copsey

votos
6

Puede establecer la prioridad de los hilos usando la Thread.Prioritypropiedad.

Por supuesto, si no hay nada más que intente ejecutar que todavía usará 100% de CPU, pero supongo que en ese caso no te importa tanto.

¿Su aplicación crea otros hilos o usa el grupo de hilos? Si es así, es probable que desee asegurarse de que esos subprocesos también tengan una prioridad reducida.

EDITAR: Establecer la prioridad general del proceso es probablemente una mejor solución en general, pero lo dejaré como una alternativa.

Respondida el 12/03/2009 a las 09:23
fuente por usuario Jon Skeet

votos
4

Como dijo que no puede cambiar la prioridad del proceso, su única opción es insertar retrasos artificiales, como se señaló en una respuesta anterior. Si inserta un Thread.Sleep (1) en su ciclo de grabación, entonces como máximo procesará 1,000 registros por segundo. Si quieres algo más granular, entonces tendrás que insertar un sueño cada N registros.

Respondida el 12/03/2009 a las 09:41
fuente por usuario Jim Mischel

votos
3

tratar

Process thisProc = Process.GetCurrentProcess();
thisProc.PriorityClass = ProcessPriorityClass.BelowNormal;//Or ProcessPriorityClass.Idle
Respondida el 12/03/2009 a las 09:25
fuente por usuario Davy8

votos
0

Si el programa está gastando grandes cantidades de datos de procesamiento de archivos, entonces debe considerar la IO asíncrona . También podría dividir el programa en múltiples secciones / múltiples hilos que están programados con pausas entre ellos

Respondida el 12/03/2009 a las 09:26
fuente por usuario Preet Sangha