BandaAncha

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

Una aplicacion de consola sencilla en C# consume mas tiempo de CPU que una de Forms mas compleja.

P B Fierro
2

El caso es que por entretenerme, estaba pensando en pasar algunas pequeñas aplicaciones que tengo de Windows Forms a consola.

Cual es mi sorpresa que una sencilla aplicación para elegir el tipo de apagado del PC hecha para consola y que va sacando el tiempo que queda para el apagado con un timer, consume hasta un 1.5 %, mientras que una bastante mas compleja hecha con un Form se mueve entre un 0 y un 0.5. Esto ocurre tanto con compilación 32 como 64 bits.

¿A qué puede deberse esto? No es que tenga mucha importancia, pero me reconcome que en principio debiera ser al revés.

Apagadores
rbetancor
2

Sin mirar el código … voy a suponer que en el caso de el código para consola, estás haciendo un bucle esperando que pase 1s y volviendo a escribir en la consola … mientras que en la versión de GUI están lanzando un timer.

Y si ese es el caso … tienes también ahí la explicación … la app de consola no está "soltando" el procesador, mientras que la de GUI si lo está "soltando".

lhacc
1

Sospecho que redibujar la consola es mucho más lento que redibujar partes de una aplicación gráfica.

P B Fierro

He descubierto que es una especie de Bug de Windows. Si configuro el programa para que se ejecute en modo de "Terminal de Windows" en lugar de "Host de consola de Windows", la aplicación pasa a consumir un 0% de uso de tiempo de CPU. Y ojo que si cambias el icono de la aplicación del que pone Visual Studio por defecto, ya no se ejecutara en modo terminal…

O sea que si usáis aplicaciones de consola y las configuráis para que se ejecuten en modo terminal, es posible que ahorréis recursos de CPU, que no de Ram.

Terminal
🗨️ 1
lhacc
1

El conhost es muy viejo y está mal optimizado, la terminal moderna es mucho más rápida.

djnacho
2

Depende de varios factores. En principio el timer no tiene porqué aumentar el uso de la CPU. Lo único que podría hacer que aumente el uso es justo el código para manejar el evento del timer, que es donde realmente se gasta tiempo de CPU (un timer no gasta tiempo de CPU prácticamente porque depende los timers internos, bien del sistema operativo, o bien del hardware del PC y eso tiene gasto equivalente a cero).

Una aplicación de consola es una aplicación "monotarea", es decir no suelta el micro tan rápido como las aplicaciones diseñadas para entorno gráfico que son multitarea. Eso quiere decir que la tarea del evento del timer se va a ejecutar sin soltar por un momento el tiempo de ejecución del micro (de ahí que pase al 1.5% que citas). Cuanto más pesado de ejecutar sea el código del evento del timer, más carga de CPU va a coger la aplicación. Es así de simple (y en las aplicaciones gráficas sucede lo mismo pero a un nivel mucho menor ya que se ejecutan en multitarea).

Un saludo 😊

🗨️ 3
P B Fierro

Las instrucciones que se ejecutan con el timer son: Mostrar la hora actual, el tiempo que queda para realizar la acción, decremento de una variable y unas ejecuciones condicionales para cuando la variable que hace de contador llegue a 0 apagar, reiniciar, bloquear, o cerrar sesión…

Pero lo curioso es que si se ejecuta en modo Terminal no pasa del 0% de CPU, mientras que en host consola me llega a tener picos del 2%…

🗨️ 2
djnacho
2

Porque un terminal no es más que eso (entrada salida de texto). Una consola es una emulación de un sistema completo (pantalla, entrada de datos y sistema de procesamiento).

En el primer caso se deja al sistema todo el control de la app, mientras que en el segundo, tarda más tiempo en hacer exactamente lo mismo.

Te dejo el artículo de Microsoft donde se explica cada cosa (no es muy profano la verdad pero bueno lo explica a su manera): learn.microsoft.com/es-es/windows/consol…/definitions

Un saludo 😊

🗨️ 1
P B Fierro

Gracias por la información!