¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

Presentación de las herramientas

Elegir las herramientas

Hay dos maneras de abordar la cuestión de las herramientas:

  • Presentar una lista de varios perfiladores y soluciones de benchmarking para que el lector se haga una idea general de las posibilidades disponibles en el mercado.

  • Enfocarse directamente sobre un conjunto de herramientas que se utilizarán en el resto del libro.

Aunque sería interesante disponer de una lista para poder comparar sus respectivas funcionalidades, esto no sería necesariamente interesante en la medida en que no se detallarían las herramientas enumeradas, lo que obligaría a realizar una investigación adicional. Por ello, se decidió que este capítulo se concentre en la presentación de las herramientas de perfilado y de benchmarking que se utilizarán en los capítulos siguientes, para que el lector tenga ya una introducción a las mismas antes de utilizarlas en mayor profundidad.

La elección de las herramientas en este capítulo, y por tanto en este libro, se ha realizado en función del estado actual del mercado, para que el lector pueda equiparse de forma rápida y económica. Cabe destacar que la selección de herramientas es casi exclusiva de Windows, debido a la madurez del marco de trabajo en este sistema operativo. No obstante, existen variantes para Linux y macOS, pero simplemente se mencionarán y no se estudiarán en detalle. Por lo tanto...

Visual Studio 2022

Visual Studio es muy a menudo la principal herramienta de trabajo del desarrollador .NET. Hoy en día existen alternativas viables, más o menos avanzadas, como Visual Studio Code o Rider de JetBrains; pero como la mayoría de los desarrolladores de .NET utilizan Visual Studio cuando trabajan en Windows, fue este último el que se eligió para el análisis de rendimiento.

La ventaja de utilizar Visual Studio es que ofrece una integración directa del conjunto de herramientas sin tener que cambiar de entorno conforme se avanza a lo largo del proyecto. Esto significa que se puede realizar una sesión de perfilado a medida que se desarrolla una funcionalidad, si esta se requiere. Además, es la propia Microsoft la que produce Visual Studio. Como tal, el IDE está lógicamente muy correlacionado y actualizado con el .NET Framework.

1. Ventana de diagnóstico

En su configuración predefinida, Visual Studio 2022 muestra directamente las herramientas de diagnóstico durante una sesión de depuración:

images/cap05_img01.png

Ventana de diagnóstico al depurar con Visual Studio

Si esta ventana no está visible, puede mostrarla al entrar en el modo de Depuración (Debug) yendo al menú Depurar, luego a Ventanas y seleccionando Mostrar herramientas de diagnóstico. El método abreviado predefinido es [Ctrl][Alt][F2].

Aunque esta ventana da una idea de cómo la utilización de la aplicación está consumiendo recursos y comportándose, no es la principal fuente de información para una sesión de perfilado. Sin embargo, le permite hacer un seguimiento de algunos de los principales eventos, así como obtener una visión general del porcentaje de CPU consumido y del consumo de RAM.

En ella encontrará los siguientes elementos:

  • Los momentos en que el GC pasa, simbolizados por pequeñas marcas amarillas en el consumo de memoria....

Contadores de rendimiento

Es posible controlar el comportamiento de una aplicación a través de una larga lista de contadores, incorporados directamente en el sistema operativo. Probablemente es la forma nativa más fácil de supervisar el rendimiento a nivel macroscópico. La monitorización por contadores permite constatar si eventualmente hay un problema, pero no le permitirá entrar en el detalle como harían Visual Studio u otras herramientas, para localizar la función o línea de código infractoras.

1. Terminología

Antes de seguir adelante, es necesario detallar la terminología de ciertas palabras utilizadas por el sistema operativo (y, por tanto, reutilizadas en los contadores) para entender el contexto donde evolucionan:

  • Memoria física: los chips de memoria que componen físicamente la configuración del ordenador. Está gestionada directamente por el sistema operativo.

  • Memoria virtual: memoria que el sistema operativo pone a disposición de los procesos que se ejecutan en ella. La memoria virtual puede superar a la memoria física gracias a ciertos procedimientos, como el espacio de memoria de intercambio (o swap). Se trata de una asignación que depende del conjunto de instrucciones del procesador. Así, una aplicación de 32 bits dispone prácticamente de 4 Gb de memoria, incluso si la memoria física es menor (lo que es extremadamente raro hoy en día). Del mismo modo, los procesos de 64 bits disponen de 128 Tb de espacio (desde Windows 8.1 y Windows Server 2012 bajo Windows), lo que es mucho más que casi todas las configuraciones existentes (y lo que Windows puede admitir, 512 Gb para Windows 10 como máximo y 48 Tb para Windows...

BenchmarkdotNet

Hasta ahora, hemos visto herramientas que le permiten supervisar el rendimiento durante la ejecución en modo usuario. Sin embargo, como vimos en el capítulo anterior, a veces tiene sentido aislar un trozo de código y ponerlo bajo presión en un benchmark para determinar si se cumple el objetivo de rendimiento.

Por supuesto, es posible realizar esta operación manualmente gracias a ciertos objetos presentes en el framework, como la clase Stopwatch, que permite activar un cronómetro.

Sin embargo, esto significaría olvidarse del funcionamiento interno de C# y sus optimizaciones. No perdamos de vista que el código C# se transforma en código IL y que es este último el que el compilador JIT recompila sobre la marcha (excepto en el caso muy específico de la compilación AOT). Y aquí es donde se puede obtener una ganancia o pérdida de rendimiento considerable.

Esta operación de compilación JIT se produce cuando el motor de ejecución accede por primera vez al código. Lo que se conoce como la sobrecarga (overhead) de la compilación JIT, que crea un retraso adicional, durante el primer acceso, debido a esta compilación. Sin embargo, una vez realizada esta operación, las llamadas posteriores son mucho más rápidas, ya que el código se ha compilado específicamente de forma óptima para el procesador...

Herramientas alternativas

Las herramientas enumeradas anteriormente son las recomendadas por el autor para tener una experiencia similar en el resto del libro, ya que son las que se utilizarán.

No obstante, el lector es libre de elegir una herramienta alternativa entre las disponibles en el mercado. He aquí una lista (no exhaustiva) de los perfiladores comerciales que se pueden encontrar:

  • dotTrace de JetBrains

  • NProfiler

  • ANTS Performance Profiler de Redgate

  • YourKit .NET Profiler

El inconveniente de utilizar una herramienta de terceros, además de tener que abandonar el entorno de desarrollo, es también el desfase entre las ejecuciones de .NET y su asistencia técnica, cosa que no ocurre cuando se utiliza Visual Studio.

Por ejemplo, ANTS Performance Profiler, que fue analizado en la primera versión de este libro, no es compatible con las últimas versiones de .NET o Visual Studio (un vistazo a su foro muestra la consternación de los usuarios con licencia que no obtienen ninguna información de la herramienta), lo que hace que la utilidad de la herramienta sea bastante baja.