Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

http://sergiot2.com/blogimages/2009/02Feb/06-Tortuga-Lenta-o-Liebre-Rapida.jpg

¿La aplicación web de Geeks.ms es rápida?

¿Rápida, para quién?. Para el programador?, para el usuario?, o para el jefe de proyectos?. ¿Cuántos segundos debe tomar cargar una aplicación para que sea rápida? –4 segundos, 8 segundos, 15 segundos?

Y las mismas preguntas podemos hacernos, para considerar una aplicación lenta.

Antes de jugar al teléfono malogrado, se debería tener un límite para considerar a una aplicación “lenta”. Si dentro de los requerimientos no funcionales, se dice que ningún formulario debe tomar más de 15 segundos para completar una operación, ya se sabe que si página o formulario toma 20 segundos, se podría decir que es lenta. Entonces, para poder definir si una aplicación es lenta o es rápida, el límite debería estar definido en los requerimientos no funcionales, y si no lo esta (en muchos casos), antes de optimizar se debería especificar cual será el tiempo de referencia a tomar, para considerar a una aplicación rápida o lenta. Así cuando llegue alguna queja del usuario por que quiere una aplicación sea más rápida, se revisa si el formulario esta dentro de los límites, y si aún así el usuario quiere más rápida (nuevos límites) ese es otro precio.

¿Todas los formularios requieren optimización?

Normalmente los procesos de mantenimiento, debería ser los más rápidos (usamos el término rápido como comparación no como medida) a comparación de los procesos de búsquedas, cargas masivas, o exportar información o procesos de fin de mes.

Veamos, si una página de mantenimiento sólo requiere hacer operaciones de consulta (muchos registros), inserción (un registro), actualización (un registro), y eliminación (un registro), no debería tomar más tiempo que otras páginas de procesos más complejos. Y para lograr esto debemos tener algunos detalles en cuenta, que son básicos:

  • Administrar correctamente las conexiones a la base de datos, liberar los recursos después de usarlos. Desde .Net, podemos usar la clausula using, para asegurarnos de liberar los recursos. Revisar esta entrada: Ado.Net y Using.
  • Paginar los resultados desde la base de datos, y no desde el cliente. Hay algunos controles mágicos que ofrecen, paginación, pero a qué costo?. Por ejemplo para paginar en Oracle podemos usar ROWNUM, y en SQL Server podemos usar ROW_NUMBER, obviamente que para lograr una paginación del lado de cliente, involucra que tengamos que pasarle dos parámetros más como el registro inicial (startRowIndex) y la cantidad de resultados (maximumRows), además de que tengamos que hacer otro método y procedure, para “contar”, ya que necesitamos saber cuantas páginas tiene el resultado.

Si seguimos estas dos reglas básicas, los formularios de mantenimiento deben ser los más rápidas de toda nuestra aplicación. Y entonces, páginas o formularios a optimizar son los procesos de búsquedas, operaciones masivas, generación de reportes, entre otros procesos complejos (1).

¿Pero qué pasa, si toda la aplicación esta lenta? Sean de mantenimientos simples o complejos, o procesos, todas demoran mucho a comparación de otra aplicación (una aplicación Web frente a una Windows). Sobre todo en esas migraciones por tendencia o moda de una aplicación Windows a Web, sobretodo si no se tiene muy claro la infraestructura de una aplicación web, el usuario dirá: pero en la aplicación Windows era más rápido, como le explicas que el navegador tiene que hacer un viaje al servidor, o lo que se conoce como postback en asp.net,  para poder ver los resultados. Y la migración de una aplicación se puede vender por dos cosas: por mejoras de procesos, o por que va ser más rápido, entonces nuevamente por que la web mas lenta, se preguntará el usuario. Entonces, si la mayoría de formularios están lentos a comparación de su previa versión, habrá que revisar el código base o código común (2).

¿Juego de Herramientas o técnicas del buen optimizador?

  1. Profiler del motor de base de datos. En el escenario 1, y el escenario 2, es bueno identificar cuales son las operaciones que se están haciendo contra una base de datos, y el tiempo que están tomando estas operaciones, la cantidad de operaciones que se esta haciendo, quizás es redundante el número de operaciones. Imaginen, que están haciendo un búsqueda sobre un catálogo de libros, tenemos varios millones de libros en nuestro catalogo, y tenemos que buscar por título, descripción, contenidos. Para SQL Server nosotros tenemos SQL Profiler. Después de analizar podemos llegar a dos conclusiones, una determina consulta esta tomando un tiempo mayor al esperado, hay que determinar si podemos hacer alguna mejora para incrementar la performance del servidor de datos, también revisar esta presentación: buenas prácticas para mejorar el rendimiento en un servidor SQL Server. Y si el problema, no esta en la consulta, si no en la recurrencia a la información?, en este escenario donde la información mostrada cambia pocas veces (una noticia de un diario, las entradas de un blog) se puede hacer el uso de técnicas de Cache, atención si la aplicación tiene alta transaccionalidad es decir se necesita hacer operaciones con la información más reciente, imaginad hacer ventas de productos que tienen stock 4 (por que así se guardo en la cache) cuando un producto ya no tiene ese stock 4, en este último escenario no es aplicable el uso de Cache.
  2. Profiler de nuestro código. Es una manera de identificar cuales son los cuellos de botella dentro de nuestro código, o para optimizar hasta la última línea de código. [.Net] Carlos Walzer, por ejemplo nos muestra el uso de la herramienta dotTrace 3.0, para analizar el tiempo y la cantidad de cada una de las llamadas dentro de .Net, con la cual podemos llegar a la mejor forma de hacer las cosas, revisar la serie: Cazando mitos en ADO.NET.
  3. Profiler del render del Html (Web). En una aplicación Web, hay otro detalle a tener en cuenta y es el tamaño del html enviado al navegador. Una excelente herramienta para detectar motivas de lentitud en la carga de una aplicación web es usar YSlow, y si están usando asp.net también puede usar la característica Tracing, con la cual podemos identificar los métodos dentro del ciclo de vida de ejecución de una página ASP.NET, además del tiempo de ejecución de los mismos, para saber cual demora más; lo otro que podemos identificar el tamaño de bytes que ocupa el render de todos los controles de la página, así como el ViewState ese monstruito que es bueno pero a la vez es malo que están ocupando. El ViewState sólo debería ser usado cuando es verdaderamente útil, todos los controles por defecto tienen habilitado el ViewState. Por ejemplo si ustedes hacen ver código fuente html de esta página, encontrarán un elemento llamado: __VIEWSTATE, y en este caso de Geeks.ms, y si vamos a un decoder online, veremos que sólo tiene un valor, que es el código de la página, si están desarrollando con ASP.NET, hagan “View in Browser” y vean el tamaño del ViewState, y vean con el decoder que se esta guardando.

Otro detalle a tener es al no liberarse correctamente los recursos y ocupar memoria, “fuga de memoria”. Dentro de Windows existe una herramienta llamada WinDBG, que puede ser usado para identificar fugas de memoria dentro de .Net por ejemplo. Y específicamente para .Net podemos usar el CLR Profiler, como en este escenario: Cómo cazar una fuga de memoria en .Net, también podemos usar .NET Memory Profiler.

Resumiendo

  1. Se debe especificar, el rango para que una aplicación sea considera rápida o lenta.
  2. Los formularios de mantenimiento deberían ser los más rápidos dentro de nuestra aplicación, por que las operaciones son simples, y debemos seguir las reglas básicas, de paginación del lado del servidor de datos y liberación de recursos (conexiones).
  3. Los formularios especiales, necesitan de herramientas especializadas para identificar donde se encuentra el cuello de botella, o los lugares posibles de optimización. Para ello disponemos de Profilers, a nivel del servidor de datos, como también a nivel del código de nuestra aplicación.
  4. Para aplicaciones Web, asegurarse que el render del html sea el adecuado.
  5. Tener cuidado con las fugas de memoria.

P.D.: Espero que esta lista de herramientas, ayuden a mejorar el rendimiento de sus aplicaciones, en algún momento mostrare algunas de ellas en determinados escenarios para ver su utilidad más claramente, quedan en los drafts como constancia.

Oros artículos de interés:

Saludos,

Published 6/2/2009 2:46 por Sergio Tarrillo
Comparte este post:
http://geeks.ms/blogs/sergiotarrillo/archive/2009/02/06/142102.aspx

Comentarios

# re: Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

" ...Si dentro de los requerimientos no funcionales, se dice que ningún formulario debe tomar más de 15 segundos... "

Este vendria a ser un Requeriminto No Funcional

Friday, February 6, 2009 3:34 PM por Juan

# re: Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

Muy buen aporte colega...

Estuve buscando un decoder del viewstate que no fuera online y me parece que este está muy bien...

lo puedes descargar de aqui o de la web del autor...

rapidshare.com/.../ViewStateDecoder22.zip

www.testingreflections.com/.../3424

Hablando del tema existen herramientas para el seguimiento del rendimiento de la bd o la aplicacion, pero sabes de algun profiler para mysql?...

Friday, February 6, 2009 3:59 PM por sac

# re: Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

¡Excelente post Sergio!

Saturday, February 7, 2009 11:01 AM por Pablo Alvarez

# re: Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

Un post excelente, para enmarcar!

Sunday, February 8, 2009 6:05 PM por Valeriano Tórtola

# re: Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

Hola @sac, hay algunos comandos para hacer Profiling de nuestros queries en MySql, revisa la siguiente página: dev.mysql.com/.../using-new-query-profiler.html. En esos ejemplos puedes hacer queries en el cmd de mySql, y hacer profiling de los mismos. No se si hay alguna manera de hacer como Sql Profiler, que escuche todos los queries (el cmd, cualquier app que se conecte la BD) y no solos los del contexto actual, quizás alguna herramienta ya lo implemente.

Pablo, excelente son tus posts :D. Por cierto alta recomendable la serie WinDBG: geeks.ms/.../default.aspx.

Gracias Valeriano.

Saludos,

Monday, February 9, 2009 3:16 AM por Sergio Tarrillo

# re: Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

Buen post.. un poco mas y llegas a hacer un manual para tunear aplicaciones

Tuesday, February 10, 2009 8:05 PM por Amilcarpg

# re: Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?

huy parce muy buen post una explicacion muy simple y profunda, gracias

Friday, August 6, 2010 4:53 PM por Fredy