Introducción
En ocasiones el rendimiento de una web puede verse afectado por su flujo de datos, ya que si este es muy grande, el tiempo de carga de las páginas es mucho mayor. Sobre todo, si la conexión a internet del usuario no es muy rápida.
Existen varios mecanismos para mejorar el rendimiento de una página web, como por ejemplo, la optimización de las operaciones realizadas en el servidor, una gestión adecuada de la caché, tanto de cliente como de servidor, la compresión de la respuesta de la página, etc.
En este artículo me voy a centrar en la compresión, aunque no descarto hablar sobre la caché más adelante, ya que la combinación de ambos métodos da muy buen resultado en rendimiento.
Compresión de páginas web
La mayoría de los navegadores soportan compresión por “gzip” y por “deflate”, pero existe la posibilidad de que no sea así, por lo que en primer lugar tendremos que decidir si aplicar o no compresión. Esto lo haremos comprobando la cabecera “Accept-Encoding” de la petición con la siguiente propiedad:
/// <summary> /// Comprueba si se puede utilizar gzip o deflate/// </summary>/// <returns></returns>public bool IsAceptaCompresion{ get{ string aceptaCodificacion = Request.Headers["Accept-Encoding"]; return (!String.IsNullOrEmpty(aceptaCodificacion) && (aceptaCodificacion.Contains("gzip") || aceptaCodificacion.Contains("deflate"))) ? true : false; } } |
Una vez sabemos si el navegador soporta compresión, aplicaremos el filtro a la respuesta de la página de la siguiente manera:
if (IsAceptaCompresion){ string aceptaCodificacion = Request.Headers["Accept-Encoding"]; if (aceptaCodificacion.Contains("gzip")) { Response.Filter = new GZipStream(Response.Filter, CompressionMode.Compress); Response.AppendHeader("Content-Encoding", "gzip");
} else if (aceptaCodificacion.Contains("deflate")) { Response.Filter = new DeflateStream(Response.Filter, CompressionMode.Compress);
Response.AppendHeader("Content-Encoding", "deflate"); } }
|
En el caso de que hubiera un proxy entre el servidor y el cliente o tuviésemos caché en la página, deberíamos distinguir entre contenido comprimido o normal. Si no lo hiciésemos podríamos obtener una ristra de letras y números que nada se parecería al resultado esperado. Esto se puede controlar agregando la siguiente línea:
Response.AppendHeader( "Vary", "Content-Encoding");
|
Conclusión
La compresión de páginas reduce significativamente (60% - 70%) el tráfico de datos entre el servidor y el cliente, a cambio, claro está de reducir el rendimiento en el servidor.
Si estamos ante una aplicación en la que el número de peticiones es muy alto, mi recomendación es aplicar esta práctica únicamente a páginas cacheadas, de modo que la compresión solo se realice la primera vez que la página se sirve.