La manera correcta de actualizar contadores de rendimiento personalizados

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!

Comparte este post:

Comentarios

# pregunton cojonero said:

algún ejemplo completo de contador de rendimiento personalizado ?? salu2grz

Wednesday, October 13, 2010 10:44 AM
# José M. Alarcón Aguín said:

No, lo siento, en el curso sí :-)

Wednesday, October 13, 2010 11:18 AM
# el que te lo dice en tu cara said:

mediocre ! ... porque no pones un post ! para eso tienes tu blog ? para que la gente se meta a los cursos que impartes para entender bien lo de contadores ? ...

Wednesday, October 13, 2010 7:43 PM
# José M. Alarcón Aguín said:

Hola:

Pues parece que no me lo dices en mi cara (como indicas en la firma) porque no te identificas.

Pues sí: entre otras cosas el blog imagino que me ayuda a promocionar los cursos. ¿Qué pasa?

¿Sabes cuántos años llevo con páginas Web con consejos y haciendo blogs?¿Cuántos cientos de posts he publicado gratuitamente para que mucha gente aprenda cosas interesantes? ¿Sabes también que mi último libro está gratis en Internet para que lo lea todo el mundo sin que le cueste un duro?

A estas alturas no tengo nada que demostrar a este respecto, y pienso que por que de vez en cuando mencione alguno de mis cursos o, directamente, ponga publicidad en el pie del post, es algo más que lícito.

Y si no publico un ejemplo completo de esto como tú pides es, entre otras cosas, porque hacer eso ya es bastante más que escribir un post y, como tengo la mala costumbre de comer, pues no puedo dedicarme tanto tiempo sólo a divulgar sin recibir nada a cambio.

Si supiera quien eres quizá podría saber qué aportas tú a la comunidad, y con qué derecho me dices lo que me dices, pero como no lo sé imagino que no andaré muy desencaminado cuando digo que no aportas NADA. La mayoría de los que como tú protestan por estas cosas son simples GORRONES que quieren que se lo den todo gratis porque no valoran el trabajo de los demás.

Este es mi blog y posteo lo que me da la gana. Y si no te gusta ya sabes donde no tienes que venir a mirar.

Atentamente,

El mediocre.

P.D.: Puedes poner lo que te de la gana. Esto es lo último que escribo al respecto pues paso de dar de comer al troll.

Thursday, October 14, 2010 8:42 AM
# Rodrigo Corral said:

Jose M. ni puñetero caso... como bien dices no alimentes al troll. Seguro que no tiene ni idea de lo que tu aportas a la comunidad.

Siempre es un placer leer tus post, con 'publicidad' de CampusMVP incluida.

Un saludo figura.

Thursday, October 14, 2010 8:50 AM
# Josué Yeray Julián Ferreiro said:

Jose M.Alarcon, es que los desarrolladores vivimos del aire, y no vale solo con compartir... los parasitos del conocimiento que nunca se han molestado ni en decir hay quieren todo, que les den!

Sigue tu trabajo excelente tio, me encanta leerte :)

Thursday, October 14, 2010 9:54 AM
# preguntoncojonero said:

siga adelante, los trolls se ignoran, se agradecen los artículos desde hace años que sigo, y a geeks.ms también, es una aportación a la comunidad a valorar y sobre todo respetar salu2grz

Monday, October 18, 2010 10:16 PM