fuel-gaugeEsta es una pregunta interesante que ha surgido en el curso de fundamentos de la plataforma .NET que tutelo on-line en campusMVP. Se trata de una pregunta sencilla pero con una sutileza interesante respecto a la creación de contadores de rendimiento para Windows desde .NET.

Cuando creamos un contador personalizado en .NET incrementamos o disminuimos su valor para actualizar la medición que queremos reflejar en el contador de rendimiento del sistema. Algunos ejemplos de contadores que podemos crear son: uno que indique el número de usuarios actualmente autenticados en nuestra aplicación Web, uno que indique el número de compras realizadas en una tienda on-line, el promedio de consultas lanzadas contra un almacén de datos, etc, etc...

Tienen mucha utilidad ya que nos permiten monitorizar con las herramientas propias de Windows el desempeño de nuestras aplicaciones, tanto en tiempo real como haciendo trazas para un análisis posterior.

El caso es que todos ellos implican generalmente el incremento y decremento de un valor almacenado en el contador.

Tenemos dos formas de actualizar el valor contenido en un contador:

  • Usando la propiedad RawValue del mismo, que contiene dicho valor y podemos leer y escribir.
  • Aumentando o disminuyendo su valor mediante los métodos Increment, Decrement o IncrementBy.

La pregunta es ¿Qué diferencia hay entre usar estos métodos o directamente el valor? Es más, ¿para qué tener esos métodos si podemos acceder al valor directamente?

RawValue accede directamente al valor del contador. Lo puedes usar para leer o escribir el valor en cualquier momento, aunque se suele usar para inicializarlo únicamente.

Si utilizas Increment, Decrement y demás métodos te estás asegurando de que te va a funcionar bien en escenarios con múltiples hilos accediendo al contador, mientras que si usas directamente RawValue para escribir el valor esto no es así.

Es decir, si escribes:

contador.Increment();

te aseguras de que aunque varios programas a la vez (o varias instancias de tu programa) incrementan el contador, el incremento se hace correctamente (es Thread-safe).

Sin embargo,si hubieras hecho esto:

contador.RawValue++;

podrías tener problemas si hay concurrencia, y los valores no serían correctos.

Esto es especialmente importante tenerlo en cuenta si vas a estar utilizando contadores personalizados en una aplicación Web, en la que puede haber gran simultaneidad en las actualizaciones del contador.

Por otro lado, si estamos seguros de que no va a haber concurrencia, usar RawValue es hasta 5 veces más rápido que usar los métodos.

¡Espero que te sea útil!

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA