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.

Compresión por gzip y deflate
David Andres .

David es analista y desarrollador de aplicaciones web cliente-servidor especializado en ASP.Net. En sus años de experiencia ha participado en proyectos para importantes empresas y entidades como Panda Security, Merck Sharp And Dohm, el gobierno de Navarra o Repsol. Conoce a fondo todas las versiones del framework .Net, bases de datos SQL Server y Oracle, y otras tecnologías como MS SharePoint y W4 Workflow. En desarrollo domina los lenguajes C#.Net, VB.Net, Java (J2EE, Struts), C, C++, JavaScript, T-SQL y PL/SQL entre otros.
Fecha de alta:02/03/2009
Última actualizacion:02/03/2009
Visitas totales:3238
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com