SlideShare una empresa de Scribd logo
High performance Web Sites
El 80% del tiempo de carga de un sitio web se debe principalmente a los siguientes componentes: Javascript CSS Imágenes Flash Reducir en número todos estos componentes hará que el renderizado de la página sea más ágil y que el número de peticiones HTTP disminuyan, por lo que la web cargará mucho más rápido. MOTIVACIÓN
Regla 1: Reducir HTTP Requests
Asociar múltiples urls a una sola imagen La imagen se divide en varias áreas con diferentes direcciones Ejemplo ASP.NET: <asp:ImageMap ID=&quot;ImageMap1&quot; runat=&quot;server&quot; Height=&quot;220px&quot; ImageUrl=&quot;~/Menu.gif&quot; Width=&quot;420px&quot;>  <asp:RectangleHotSpot Bottom=&quot;220&quot; HotSpotMode=&quot;Navigate&quot; NavigateUrl=&quot;~/Productos.aspx&quot; Right=&quot;140&quot; AlternateText=&quot;Productos&quot; /> <asp:RectangleHotSpot Bottom=&quot;220&quot; HotSpotMode=&quot;Navigate&quot; Left=&quot;141&quot; NavigateUrl=&quot;~/Carteras.aspx&quot; Right=&quot;280&quot; AlternateText=&quot;Cartera&quot; /> <asp:RectangleHotSpot Bottom=&quot;220&quot; HotSpotMode=&quot;Navigate&quot; Left=&quot;281&quot; NavigateUrl=&quot;~/Contacto.aspx&quot; Right=&quot;420&quot; AlternateText=&quot;Contacto&quot; />  </asp:ImageMap> Problema:  tedioso y posibilidad de error al crearlo Solución:  CSS Sprites. UTILIZAR IMAGE MAPS
Combinar múltiples imágenes en una sola  Combinando las imágenes de fondo con las propiedades background-position y background-image se puede mostrar partes de la misma imagen haciendo que todas las imágenes principales de la web se llamen a la vez.  Ejemplos:  http://www.w3schools.com/css/css_image_sprites.asp UTILIZAR CSS SPRITES
Incrustar la imagen en la página usando   data: Url Scheme.  Problema:  No soportado por IE. Ejemplo: <IMG ALT=&quot;Red Star&quot; SRC=&quot;data:image/gif;base64,R0lGODlhDAAMALMLAPN8ffBiYvWW lvrKy/FvcPewsO9VVfajo+w6O/zl5estLv/8/AAAAAAAAAAAAAAAACH5BAEA AAsALAAAAAAMAAwAAAQzcElZyryTEHyTUgknHd9xGV+qKsYirKkwDYiKDBia tt2H1KBLQRFIJAIKywRgmhwAIlEEADs=&quot;> UTILIZAR INLINE IMAGES
Incluir jscript y css que se utilizan en la misma página en un único fichero. Lo ideal es un fichero .js y otro .css por página. Problema:  unificar los ficheros complica el desarrollo. Solución:   Desarrollar proceso que combine los archivos para generar los que necesitan las páginas.  UNIFICAR SCRIPTS Y CSS
Regla 2: Content Delivery Network
Una red de distribución de contenido (CDN) se suele usar para agilizar la distribución de archivos estáticos (imágenes, hojas de estilo, javascripts, multimedia...).  Las CDNs permiten tener los contenidos replicados en múltiples servidores por todo el mundo, acelerando la descarga de los mismo, puesto que se sirven desde la ubicación más cercana al usuario. Problema:  Coste muy elevado para pequeñas empresas. UTILIZAR CDN
Regla 3: Añadir Expires Header
Para los archivos estáticos: implementar &quot;Never expire&quot; como Expires Header para las próximas visitas.  Para los archivos dinámicos: usa el Cache-Control Header más propiado para ayudar al navegador en las llamadas HTTP.  Usar un Expires Header permite que algunos componentes (scripts, hojas de estilo, imágenes, animaciones Flash,etc.) se guarden en la cache del navegador.  Ej: Expires: Thu, 16 Apr 2011 20:00:00 GMT  Problema:  Actualización de recursos  Solución:  Utilizar versiones en .js, .css  La mejora es útil si el usuario visita con frecuencia el sitio web. EXPIRES HEADER
Regla 4: Componentes Gzip
A partir de HTTP/1.1, los navegadores web permiten el soporte para compresion con la cabecera Accept-Encoding en la petición HTTP. Accept-Encoding: gzip, deflate.  Si el servidor web visualiza esta cabecera en la petición, puede comprimir la respuesta usando uno de los métodos listados por el cliente. El servidor web notifica al cliente a través de la cabecera Content-Encoding en la respuesta. Content-Encoding: gzip.  Es el más utilizado. Apache (mod_gzip, mod_deflate) / IIS (PipeBoost, VIGOS o Hyperspace) Las imágenes y los documentos PDF no deben ser tratados con Gzip ya que estos ya están comprimidos. Intentar hacerlo no sólo desperdicia recursos del CPU, sino que incrementan el tamaño del archivo. COMPONENTES GZIP
Los servidores  Proxy Cache  permiten optimizar el uso de ancho de banda, reducir latencias y por lo general hacer un mejor uso de los recursos disponibles.  PROXY CACHE (I)
La petición llega al proxy, revisa su cache para comprobar si dispone de los objetos que se van solicitando (HIT o MISS). En el caso de que el objeto buscado se encuentre en cache (HIT), el proxy verifica que no ha expirado.  Problema:  Si el proxy tiene la información comprimida aunque alguno de los servidores al q se le hace la petición no tiene soporte para gzip devuelve los datos comprimidos al navegador.  Solución:  Vary Header en el Response (Vary: Accept-Encoding). Se mantendrán las dos versiones. Sporte gzip para IIS: utilizar User-Agent para indicar versiones del navegador. PROXY CACHE (II)
Regla 5: CSS  en la cabecera
Poner las hojas de estilo al principio de la página permite que se renderice progresivamente. Poner en el Head utilizando LINK tag. CSS
Regla 6: Scripts al final de la página
DESCARGAS PARALELAS HTTP/1.1: sugiere que los navegadores descarguen 2 componentes por host. network.http.max-persistent-connections-per-server  = 6 (Firefox 3.6.3). Aumentar el número de descargas paralelas tiene un coste que en ciertos equipos con poco ancho de banda conlleva una disminución del rendimiento.
2 descargas paralelas por host. 4 descargas paralelas por host. 8 descargas paralelas por host.
Utilizar CNAMEs (alias DNS) para dividir sus componentes en múltiples hostnames.
JavaScripts bloquean la descarga paralela.
http://stevesouders.com/hpws/move-scripts.php Diferencia de tiempo entre scripts en parte superior a la parte inferior. http://stevesouders.com/hpws/js-blocking.php Ejemplo de cómo el script bloquea las descargas de los componentes.
Regla 7: Evitar expresiones CSS
¿Qué son? Una manera de establecer propiedades CSS de forma dinámica. EXPRESIONES CSS Width: expression(document.body.clientWidth < 600 ? “600px” : “auto”); ¿Inconvenientes? - Solo funcionan con Internet Explorer 5 y superior. - El resto de navegadores ignoran las expresiones CSS. - Se evalúan cada vez que cuando la página es renderizada, cuando se    ajusta el tamaño, cuando se hace scroll y cuando se mueve  el ratón  sobre la página.
SOLUCIÓN One-Time Expressions <style> P{ background-color: expression(altBgcolor(this); } </style> <script type=“text-javascript”> function altBgcolor(elem){ elem.style.backgroundColor = (new Date()).getHours()%2 ? “#F08A00” : “#B8D4FF”; } </script>
SOLUCIÓN Event Handlers
Ejemplo de CSS Expression. http://stevesouders.com/hpws/expression-counter.php Ejemplo de One-Time Expression. http://stevesouders.com/hpws/onetime-expressions.php
Regla 8: Hacer Javascript y CSS externos
JS/CSS EXTERNOS vs JS/CSS INTERNOS   INTERNO Es aconsejable para sites con pocas páginas visitadas por usuario. EXTERNO Permite cachear los archivos para no volver a descargarlos. Es aconsejable para sites donde el usuario visita muchas páginas al mes o por sesión.
JAVASCRIPT/CSS EXTERNOS UN SOLO ARCHIVO VARIOS ARCHIVOS Es aconsejable para sites con pocas páginas visitadas por usuario. Es aconsejable para sites donde el usuario visita muchas páginas al mes o por sesión.
JAVASCRIPT/CSS INTERNOS Páginas HOME Tiene muchas visitas al mes pero solo una visita por sesión. Muchos usuarios vacían la caché al cerrar el navegador. En mucho casos es la única página visitada del site por lo que no comparte JavaScripts ni CSS con otras páginas.
POST-ONLOAD DOWNLOAD La home utiliza JavaScripts / CSS internos pero al cargarse esta. Con el evento OnLoad() descarga los archivos externos para las sucesivas páginas.
EJEMPLO POST-ONLOAD
INTERNO / EXTERNO DINÁMICAMENTE
Ejemplo de Post-onload. http://stevesouders.com/hpws/post-onload.php Ejemplo de  Dynamic Inlining . http://stevesouders.com/hpws/dynamic-inlining.php
Regla 9: Reducir búsquedas DNS
TTLs & DNS CACHING Cada petición DNS del navegador tarda entre 20-120 ms. Cache DNS En un servidor del ISP. En el sistema operativo (DNS Client Service). En el propio navegador
TTLs
Internet Explorer DnsCacheTimeout: 30 minutes KeepAliveTimeout: 1 minute ServerInfoTimeOut: 2 minutes Firefox network.dnsCacheExpiration: 1 minute network.dnsCacheEntries: 20 network.http.keep-alive.timeout: 5 minutes
Reducir el número de hostnames incluidos en el site.
Regla 10: Minimizar JavaScripts y CSS
OFUSCACIÓN Técnica alternativa a la minimización. Consigue mejores resultados (25% sobre 21% de la minimización). Problemas: Es más complejo que la minimización Necesita revisarse. Dificultad para debugar.
OFUSCACIÓN Resultados http://crockford.com/javascript/jsmin http://dojotoolkit.org/
Resultados: reglas 6 - 10
Regla 11: Evitar redirecciones
Redirects Los  Redirects  hacen las páginas más lentas. Existen diferentes razones para implementar redirects:  rediseño de un sitio web,  registrar trazas de tráfico, crear URLs fáciles de recordar, etc. Tipos de Redirects: 300 Multiple Choices 301 Moved Permanently 302 Moved Temporarily 303 See Other (clarification of 302) 304 Not Modified *** 305 Use Proxy 306 (no longer used) 307 Temporary Redirect (clarification of 302) Otros tipos de Redirects: La cabecera meta que redirecciona al cabo de unos segundo <meta http-equiv=&quot;refresh&quot; content=&quot;0; url=http://www.impok.com&quot;> Javascript: modificando el valor de  document.location
Redirects Los  Redirects  se utilizan típicamente con las peticiones del documento HTML, pero también se pueden encontrar para obtener componentes de la web.
Usos y Alternativas de los Redirects Ausencia de la barra / al final de la URL y URL bonitas Razones para enviar un redirect cuando la barra final / no esté en la URL:  Permite el autoindexado (páginas por defecto). Permite recuerar URLs relativas al directorio actual. Las soluciones que se plantean para evitar estos redirects se basan en la configuración del servidor web. Conectar Sitios Web Es bastante común cambiar de sitio web para lo que se suelen usar redirects. Existen sitios web que redireccionan a una página web u otra según el navegador que se use. Las soluciones que se plantean para evitar estos redirects se basan en la configuración del servidor web.
Evitar Redirects Registrar trazas de tráfico. Se realizan redirects a una página que registra el log de la traza y luego está redirecciona a la página correspondiente. Para tráfico interno:  Se evitan estos redirects registrando en la página a la que se quiere ir el log de la traza mediante el uso de  Referer . Para tráfico a páginas externas: Se evitan los redirects con el uso de un  beacon , una petición HTTP que contiene la información de la traza en la URL
Regla 12: Eliminar Scripts duplicados
Scripts Duplicados Motivos por los que pueden aparecer scripts duplicados en una página web: Tamaño del equipo de desarrollo. Número de scripts que tiene la página.
Scripts Duplicados Tener scripts duplicados en una página web empeoran el rendimiento porque: Se realizan peticiones HTTP innecesarias. Se desperdicia tiempo de ejecución del script duplicado.
Evitar Scripts Duplicados La solución es implementar un  script management module . El  script management module  debe encargarse de saber si el script ya está incluido. En el caso de que no esté incluido debe incluirlo y debe incluir también todas sus dependencias. Hay que capturar las relaciones de dependencia de los scripts: En un sitio web sencillo se pueden mantener de forma manual. En un sitio web más complejo hay que automatizar la generación de las dependencias escaneando los scripts. Es conveniente añadir la versión del script al nombre del fichero para que el  script management module  se encargue de incluir solo la versión correspondiente del script.
Regla 13: Configurar ETags
¿Qué es un ETag? Los  Entity tags  son un mecanismo que utilizan el servidor web y los navegadors para validar los componentes cacheados de una web. Un navegador se descarga los componentes de una web y los cachea. Mientras el componente tenga su fecha de expiración activa, el navegador lee el componente de disco. Cuando la fecha de expiración caduca el navegador realiza una petición GET condicional ( conditional GET request ) para saber si el componente ha cambiado. Si el componente no ha cambiado el servidor devuelve un código de estado  “304 Not Modified” . Si el componente ha cambiado el servidor lo devuelve.
¿Qué es un ETag? Modos de saber si un componente ha cambiado: Comparando la fecha de última modificación Comparando la fecha de última modificación
Problema de los ETag’s Los ETag’s son más flexibles que el mecanismo que compara la última fecha de modificación ya que incluyen modificaciones que no tienen que ver con el componente en sí, como son las cabeceras. El problema de los ETag’s es que se construyen usando atributos que lo hagan único en un servidor web. Si una aplicación está distribuida en varios servidores, los Etag’s para un mismo componente que se encuentre en ambos servidores puede ser diferente y realizarse así la petición del componente varias veces.
Reconfigurar los ETag’s o eliminarlos Si la aplicación se encuentra solamente en un servidor no hay problema. Pero si una aplicación se encuentra distribuida en varios servidores habría que reconfigurar la generación de los ETag’s o simplemente eliminarlos. Dependiendo del servidor web que se utilice, esté inserta una información u otra propia del servidor. Se puede personalizar la generación de los ETag’s para evitar que estos incluyan información propia del servidor. Evitando esto, se obtiene prácticamente la misma información que mediante la última fecha de modificación, por lo que habría que plantearse simplemente eliminar la generación de los ETag’s.
ETag’s en el mundo real
Regla 14: Hacer el Ajax Cacheable
Web 2.0 “ El termino  Web  está comúnmente asociado con un fenómeno social, basado en la interacción que se logra a partir de diferentes aplicaciones web, que facilitan el compartir información, la interoperabilidad , el  diseño centrado en el usuario y la colaboración en la World Wide Web” . DHTML y Ajax son tecnologías para implementar estos conceptos. Dynamic HTML permite modificar la representación HTML de una página después de que esta página se haya cargado. Esto es posible mediante JavaScript y CSS que interactuan con el DOM ( Document Object Model ). Ajax es la tecnología usada en DHTML que permite interactuar al cliente con el servidor sin la necesidad de recargar la página. Ajax representa “ Asincrono JAvascript y Xml ”.
Ajax Es importante saber que “asíncrono” no implica “instantáneo”. Ajax permite que mientras se realiza la petición asíncrona el usuario sigua visitando y realizando acciones sobre la página web. Por lo que es necesario que las peticiones Ajax que se realicen sean óptimas. Existen dos tipos de peticiones Ajax: Peticiones Pasivas: Están preparadas anticipando el futuro que se necesite. Peticiones Activas: Se realizan cuando se necesita saber de la acción que realiza el usuario.
Optimización de las peticiones Ajax Las técnicas que se pueden emplear para optimizar peticiones Ajax son las mismas que las reglas que se han descrito: Regla 4: Componentes Gzip Regla 9: Busquedas DNS Regla 10: Minimizar Javascript Regla 11: Evitar Redirects Regla 13: Etag’s Pero la regla más importante para la optimización de las peticiones activas Ajax es cachear las respuestas (Regla 3). Cachear las peticiones Ajax es tan simple como modificar las cabeceras HTTP de la petición. Pero la naturaleza dinámica y personalizada de la respuesta debe reflejarse en lo que se cachea. La mejor manera de hacer esto es mediante los parámetros de la query.
¿Preguntas?

Más contenido relacionado

PDF
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
PDF
PDF
Varnish http cache
PDF
Carlos Pascual #WPvalladolid 2014
PPTX
Wordpress
PDF
Curso avanzado de programación y configuración de Wordpress
PDF
Manual de instalacion cubecart en castellano
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
Varnish http cache
Carlos Pascual #WPvalladolid 2014
Wordpress
Curso avanzado de programación y configuración de Wordpress
Manual de instalacion cubecart en castellano

La actualidad más candente (17)

ODP
Taller de optimizacion de servidores web tipo LAMP
PDF
1212
PDF
Proyecto Integrado Chef
PDF
Webperf wordpress
PDF
Generación de web sites dinámicos usando php
PPT
Hacking uploaders
PDF
Introducción a herramientas de Roots (José Debuchy, WCBA 2017)
PDF
Deploying Wordpress
KEY
Html5 - El futuro de la web
PPT
Sacándole el jugo a apache
PDF
Un poco más allá con grails. PrimerViernes
PPT
JBoss AS Cluster - Curso JBoss JB366 Día 4
PDF
Apache: Servidor Web Seguro (HTTPS)
PDF
Webinar - Radiografía actual del lenguaje PHP
PPT
Servlets y jsp
PDF
Apache3 christiany victor
Taller de optimizacion de servidores web tipo LAMP
1212
Proyecto Integrado Chef
Webperf wordpress
Generación de web sites dinámicos usando php
Hacking uploaders
Introducción a herramientas de Roots (José Debuchy, WCBA 2017)
Deploying Wordpress
Html5 - El futuro de la web
Sacándole el jugo a apache
Un poco más allá con grails. PrimerViernes
JBoss AS Cluster - Curso JBoss JB366 Día 4
Apache: Servidor Web Seguro (HTTPS)
Webinar - Radiografía actual del lenguaje PHP
Servlets y jsp
Apache3 christiany victor
Publicidad

Destacado (7)

PPT
Capybara
PPT
PPT
Introduction to test programming
PPT
PPT
Coaching
PPTX
Cucumber
Capybara
Introduction to test programming
Coaching
Cucumber
Publicidad

Similar a High performance Web Sites (20)

PPTX
C:\fakepath\optimizacion
PDF
0094 rodrigo zubeldía alphasoluciones
PPTX
Puntos clave para optimizar Wordpress by Raiola Networks
PPTX
Performance en Drupal 7
PDF
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?
PDF
Front-end: Diseñar webs rápidas, flexibles y potentes
PPTX
ASP.NET MVC Workshop Día 3
PDF
Charla betabeers optimización y rendimiento en Wordpress - Marcos Ramajo
ODP
Presentación Congreso Internet del Mediterráneo
PDF
Charla web performance optimization
ODP
Workshop "Técnicas de optimización web" en Webprendedor 2011
PPT
Aspnet40 Cache Extensibility
DOCX
Servidor web
PDF
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBF
PDF
La Caché
ODP
Marcos quesada caching_sf2
PDF
Aceleradores Php Final - Programador PHP
PDF
Aceleradores PHP Final - Programador PHP
PDF
Aceleradores Php Final - Programador PHP
C:\fakepath\optimizacion
0094 rodrigo zubeldía alphasoluciones
Puntos clave para optimizar Wordpress by Raiola Networks
Performance en Drupal 7
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?
Front-end: Diseñar webs rápidas, flexibles y potentes
ASP.NET MVC Workshop Día 3
Charla betabeers optimización y rendimiento en Wordpress - Marcos Ramajo
Presentación Congreso Internet del Mediterráneo
Charla web performance optimization
Workshop "Técnicas de optimización web" en Webprendedor 2011
Aspnet40 Cache Extensibility
Servidor web
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBF
La Caché
Marcos quesada caching_sf2
Aceleradores Php Final - Programador PHP
Aceleradores PHP Final - Programador PHP
Aceleradores Php Final - Programador PHP

Último (20)

PDF
CyberOps Associate - Cisco Networking Academy
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PPT
introduccion a las_web en el 2025_mejoras.ppt
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PDF
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
Diapositiva proyecto de vida, materia catedra
PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PDF
Estrategia de apoyo tecnología miguel angel solis
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPTX
Propuesta BKP servidores con Acronis1.pptx
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PDF
SAP Transportation Management para LSP, TM140 Col18
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
Estrategia de apoyo tecnología grado 9-3
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Maste clas de estructura metálica y arquitectura
CyberOps Associate - Cisco Networking Academy
REDES INFORMATICAS REDES INFORMATICAS.pptx
introduccion a las_web en el 2025_mejoras.ppt
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
Diapositiva proyecto de vida, materia catedra
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
Estrategia de apoyo tecnología miguel angel solis
Zarate Quispe Alex aldayir aplicaciones de internet .docx
Plantilla para Diseño de Narrativas Transmedia.pdf
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Propuesta BKP servidores con Acronis1.pptx
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
SAP Transportation Management para LSP, TM140 Col18
Calidad desde el Docente y la mejora continua .pdf
Estrategia de apoyo tecnología grado 9-3
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Maste clas de estructura metálica y arquitectura

High performance Web Sites

  • 2. El 80% del tiempo de carga de un sitio web se debe principalmente a los siguientes componentes: Javascript CSS Imágenes Flash Reducir en número todos estos componentes hará que el renderizado de la página sea más ágil y que el número de peticiones HTTP disminuyan, por lo que la web cargará mucho más rápido. MOTIVACIÓN
  • 3. Regla 1: Reducir HTTP Requests
  • 4. Asociar múltiples urls a una sola imagen La imagen se divide en varias áreas con diferentes direcciones Ejemplo ASP.NET: <asp:ImageMap ID=&quot;ImageMap1&quot; runat=&quot;server&quot; Height=&quot;220px&quot; ImageUrl=&quot;~/Menu.gif&quot; Width=&quot;420px&quot;> <asp:RectangleHotSpot Bottom=&quot;220&quot; HotSpotMode=&quot;Navigate&quot; NavigateUrl=&quot;~/Productos.aspx&quot; Right=&quot;140&quot; AlternateText=&quot;Productos&quot; /> <asp:RectangleHotSpot Bottom=&quot;220&quot; HotSpotMode=&quot;Navigate&quot; Left=&quot;141&quot; NavigateUrl=&quot;~/Carteras.aspx&quot; Right=&quot;280&quot; AlternateText=&quot;Cartera&quot; /> <asp:RectangleHotSpot Bottom=&quot;220&quot; HotSpotMode=&quot;Navigate&quot; Left=&quot;281&quot; NavigateUrl=&quot;~/Contacto.aspx&quot; Right=&quot;420&quot; AlternateText=&quot;Contacto&quot; /> </asp:ImageMap> Problema: tedioso y posibilidad de error al crearlo Solución: CSS Sprites. UTILIZAR IMAGE MAPS
  • 5. Combinar múltiples imágenes en una sola Combinando las imágenes de fondo con las propiedades background-position y background-image se puede mostrar partes de la misma imagen haciendo que todas las imágenes principales de la web se llamen a la vez. Ejemplos: http://www.w3schools.com/css/css_image_sprites.asp UTILIZAR CSS SPRITES
  • 6. Incrustar la imagen en la página usando data: Url Scheme. Problema: No soportado por IE. Ejemplo: <IMG ALT=&quot;Red Star&quot; SRC=&quot;data:image/gif;base64,R0lGODlhDAAMALMLAPN8ffBiYvWW lvrKy/FvcPewsO9VVfajo+w6O/zl5estLv/8/AAAAAAAAAAAAAAAACH5BAEA AAsALAAAAAAMAAwAAAQzcElZyryTEHyTUgknHd9xGV+qKsYirKkwDYiKDBia tt2H1KBLQRFIJAIKywRgmhwAIlEEADs=&quot;> UTILIZAR INLINE IMAGES
  • 7. Incluir jscript y css que se utilizan en la misma página en un único fichero. Lo ideal es un fichero .js y otro .css por página. Problema: unificar los ficheros complica el desarrollo. Solución: Desarrollar proceso que combine los archivos para generar los que necesitan las páginas. UNIFICAR SCRIPTS Y CSS
  • 8. Regla 2: Content Delivery Network
  • 9. Una red de distribución de contenido (CDN) se suele usar para agilizar la distribución de archivos estáticos (imágenes, hojas de estilo, javascripts, multimedia...). Las CDNs permiten tener los contenidos replicados en múltiples servidores por todo el mundo, acelerando la descarga de los mismo, puesto que se sirven desde la ubicación más cercana al usuario. Problema: Coste muy elevado para pequeñas empresas. UTILIZAR CDN
  • 10. Regla 3: Añadir Expires Header
  • 11. Para los archivos estáticos: implementar &quot;Never expire&quot; como Expires Header para las próximas visitas. Para los archivos dinámicos: usa el Cache-Control Header más propiado para ayudar al navegador en las llamadas HTTP. Usar un Expires Header permite que algunos componentes (scripts, hojas de estilo, imágenes, animaciones Flash,etc.) se guarden en la cache del navegador. Ej: Expires: Thu, 16 Apr 2011 20:00:00 GMT Problema: Actualización de recursos Solución: Utilizar versiones en .js, .css La mejora es útil si el usuario visita con frecuencia el sitio web. EXPIRES HEADER
  • 13. A partir de HTTP/1.1, los navegadores web permiten el soporte para compresion con la cabecera Accept-Encoding en la petición HTTP. Accept-Encoding: gzip, deflate. Si el servidor web visualiza esta cabecera en la petición, puede comprimir la respuesta usando uno de los métodos listados por el cliente. El servidor web notifica al cliente a través de la cabecera Content-Encoding en la respuesta. Content-Encoding: gzip. Es el más utilizado. Apache (mod_gzip, mod_deflate) / IIS (PipeBoost, VIGOS o Hyperspace) Las imágenes y los documentos PDF no deben ser tratados con Gzip ya que estos ya están comprimidos. Intentar hacerlo no sólo desperdicia recursos del CPU, sino que incrementan el tamaño del archivo. COMPONENTES GZIP
  • 14. Los servidores Proxy Cache permiten optimizar el uso de ancho de banda, reducir latencias y por lo general hacer un mejor uso de los recursos disponibles. PROXY CACHE (I)
  • 15. La petición llega al proxy, revisa su cache para comprobar si dispone de los objetos que se van solicitando (HIT o MISS). En el caso de que el objeto buscado se encuentre en cache (HIT), el proxy verifica que no ha expirado. Problema: Si el proxy tiene la información comprimida aunque alguno de los servidores al q se le hace la petición no tiene soporte para gzip devuelve los datos comprimidos al navegador. Solución: Vary Header en el Response (Vary: Accept-Encoding). Se mantendrán las dos versiones. Sporte gzip para IIS: utilizar User-Agent para indicar versiones del navegador. PROXY CACHE (II)
  • 16. Regla 5: CSS en la cabecera
  • 17. Poner las hojas de estilo al principio de la página permite que se renderice progresivamente. Poner en el Head utilizando LINK tag. CSS
  • 18. Regla 6: Scripts al final de la página
  • 19. DESCARGAS PARALELAS HTTP/1.1: sugiere que los navegadores descarguen 2 componentes por host. network.http.max-persistent-connections-per-server = 6 (Firefox 3.6.3). Aumentar el número de descargas paralelas tiene un coste que en ciertos equipos con poco ancho de banda conlleva una disminución del rendimiento.
  • 20. 2 descargas paralelas por host. 4 descargas paralelas por host. 8 descargas paralelas por host.
  • 21. Utilizar CNAMEs (alias DNS) para dividir sus componentes en múltiples hostnames.
  • 22. JavaScripts bloquean la descarga paralela.
  • 23. http://stevesouders.com/hpws/move-scripts.php Diferencia de tiempo entre scripts en parte superior a la parte inferior. http://stevesouders.com/hpws/js-blocking.php Ejemplo de cómo el script bloquea las descargas de los componentes.
  • 24. Regla 7: Evitar expresiones CSS
  • 25. ¿Qué son? Una manera de establecer propiedades CSS de forma dinámica. EXPRESIONES CSS Width: expression(document.body.clientWidth < 600 ? “600px” : “auto”); ¿Inconvenientes? - Solo funcionan con Internet Explorer 5 y superior. - El resto de navegadores ignoran las expresiones CSS. - Se evalúan cada vez que cuando la página es renderizada, cuando se ajusta el tamaño, cuando se hace scroll y cuando se mueve el ratón sobre la página.
  • 26. SOLUCIÓN One-Time Expressions <style> P{ background-color: expression(altBgcolor(this); } </style> <script type=“text-javascript”> function altBgcolor(elem){ elem.style.backgroundColor = (new Date()).getHours()%2 ? “#F08A00” : “#B8D4FF”; } </script>
  • 28. Ejemplo de CSS Expression. http://stevesouders.com/hpws/expression-counter.php Ejemplo de One-Time Expression. http://stevesouders.com/hpws/onetime-expressions.php
  • 29. Regla 8: Hacer Javascript y CSS externos
  • 30. JS/CSS EXTERNOS vs JS/CSS INTERNOS INTERNO Es aconsejable para sites con pocas páginas visitadas por usuario. EXTERNO Permite cachear los archivos para no volver a descargarlos. Es aconsejable para sites donde el usuario visita muchas páginas al mes o por sesión.
  • 31. JAVASCRIPT/CSS EXTERNOS UN SOLO ARCHIVO VARIOS ARCHIVOS Es aconsejable para sites con pocas páginas visitadas por usuario. Es aconsejable para sites donde el usuario visita muchas páginas al mes o por sesión.
  • 32. JAVASCRIPT/CSS INTERNOS Páginas HOME Tiene muchas visitas al mes pero solo una visita por sesión. Muchos usuarios vacían la caché al cerrar el navegador. En mucho casos es la única página visitada del site por lo que no comparte JavaScripts ni CSS con otras páginas.
  • 33. POST-ONLOAD DOWNLOAD La home utiliza JavaScripts / CSS internos pero al cargarse esta. Con el evento OnLoad() descarga los archivos externos para las sucesivas páginas.
  • 35. INTERNO / EXTERNO DINÁMICAMENTE
  • 36. Ejemplo de Post-onload. http://stevesouders.com/hpws/post-onload.php Ejemplo de Dynamic Inlining . http://stevesouders.com/hpws/dynamic-inlining.php
  • 37. Regla 9: Reducir búsquedas DNS
  • 38. TTLs & DNS CACHING Cada petición DNS del navegador tarda entre 20-120 ms. Cache DNS En un servidor del ISP. En el sistema operativo (DNS Client Service). En el propio navegador
  • 39. TTLs
  • 40. Internet Explorer DnsCacheTimeout: 30 minutes KeepAliveTimeout: 1 minute ServerInfoTimeOut: 2 minutes Firefox network.dnsCacheExpiration: 1 minute network.dnsCacheEntries: 20 network.http.keep-alive.timeout: 5 minutes
  • 41. Reducir el número de hostnames incluidos en el site.
  • 42. Regla 10: Minimizar JavaScripts y CSS
  • 43. OFUSCACIÓN Técnica alternativa a la minimización. Consigue mejores resultados (25% sobre 21% de la minimización). Problemas: Es más complejo que la minimización Necesita revisarse. Dificultad para debugar.
  • 46. Regla 11: Evitar redirecciones
  • 47. Redirects Los Redirects hacen las páginas más lentas. Existen diferentes razones para implementar redirects: rediseño de un sitio web, registrar trazas de tráfico, crear URLs fáciles de recordar, etc. Tipos de Redirects: 300 Multiple Choices 301 Moved Permanently 302 Moved Temporarily 303 See Other (clarification of 302) 304 Not Modified *** 305 Use Proxy 306 (no longer used) 307 Temporary Redirect (clarification of 302) Otros tipos de Redirects: La cabecera meta que redirecciona al cabo de unos segundo <meta http-equiv=&quot;refresh&quot; content=&quot;0; url=http://www.impok.com&quot;> Javascript: modificando el valor de document.location
  • 48. Redirects Los Redirects se utilizan típicamente con las peticiones del documento HTML, pero también se pueden encontrar para obtener componentes de la web.
  • 49. Usos y Alternativas de los Redirects Ausencia de la barra / al final de la URL y URL bonitas Razones para enviar un redirect cuando la barra final / no esté en la URL: Permite el autoindexado (páginas por defecto). Permite recuerar URLs relativas al directorio actual. Las soluciones que se plantean para evitar estos redirects se basan en la configuración del servidor web. Conectar Sitios Web Es bastante común cambiar de sitio web para lo que se suelen usar redirects. Existen sitios web que redireccionan a una página web u otra según el navegador que se use. Las soluciones que se plantean para evitar estos redirects se basan en la configuración del servidor web.
  • 50. Evitar Redirects Registrar trazas de tráfico. Se realizan redirects a una página que registra el log de la traza y luego está redirecciona a la página correspondiente. Para tráfico interno: Se evitan estos redirects registrando en la página a la que se quiere ir el log de la traza mediante el uso de Referer . Para tráfico a páginas externas: Se evitan los redirects con el uso de un beacon , una petición HTTP que contiene la información de la traza en la URL
  • 51. Regla 12: Eliminar Scripts duplicados
  • 52. Scripts Duplicados Motivos por los que pueden aparecer scripts duplicados en una página web: Tamaño del equipo de desarrollo. Número de scripts que tiene la página.
  • 53. Scripts Duplicados Tener scripts duplicados en una página web empeoran el rendimiento porque: Se realizan peticiones HTTP innecesarias. Se desperdicia tiempo de ejecución del script duplicado.
  • 54. Evitar Scripts Duplicados La solución es implementar un script management module . El script management module debe encargarse de saber si el script ya está incluido. En el caso de que no esté incluido debe incluirlo y debe incluir también todas sus dependencias. Hay que capturar las relaciones de dependencia de los scripts: En un sitio web sencillo se pueden mantener de forma manual. En un sitio web más complejo hay que automatizar la generación de las dependencias escaneando los scripts. Es conveniente añadir la versión del script al nombre del fichero para que el script management module se encargue de incluir solo la versión correspondiente del script.
  • 56. ¿Qué es un ETag? Los Entity tags son un mecanismo que utilizan el servidor web y los navegadors para validar los componentes cacheados de una web. Un navegador se descarga los componentes de una web y los cachea. Mientras el componente tenga su fecha de expiración activa, el navegador lee el componente de disco. Cuando la fecha de expiración caduca el navegador realiza una petición GET condicional ( conditional GET request ) para saber si el componente ha cambiado. Si el componente no ha cambiado el servidor devuelve un código de estado “304 Not Modified” . Si el componente ha cambiado el servidor lo devuelve.
  • 57. ¿Qué es un ETag? Modos de saber si un componente ha cambiado: Comparando la fecha de última modificación Comparando la fecha de última modificación
  • 58. Problema de los ETag’s Los ETag’s son más flexibles que el mecanismo que compara la última fecha de modificación ya que incluyen modificaciones que no tienen que ver con el componente en sí, como son las cabeceras. El problema de los ETag’s es que se construyen usando atributos que lo hagan único en un servidor web. Si una aplicación está distribuida en varios servidores, los Etag’s para un mismo componente que se encuentre en ambos servidores puede ser diferente y realizarse así la petición del componente varias veces.
  • 59. Reconfigurar los ETag’s o eliminarlos Si la aplicación se encuentra solamente en un servidor no hay problema. Pero si una aplicación se encuentra distribuida en varios servidores habría que reconfigurar la generación de los ETag’s o simplemente eliminarlos. Dependiendo del servidor web que se utilice, esté inserta una información u otra propia del servidor. Se puede personalizar la generación de los ETag’s para evitar que estos incluyan información propia del servidor. Evitando esto, se obtiene prácticamente la misma información que mediante la última fecha de modificación, por lo que habría que plantearse simplemente eliminar la generación de los ETag’s.
  • 60. ETag’s en el mundo real
  • 61. Regla 14: Hacer el Ajax Cacheable
  • 62. Web 2.0 “ El termino Web está comúnmente asociado con un fenómeno social, basado en la interacción que se logra a partir de diferentes aplicaciones web, que facilitan el compartir información, la interoperabilidad , el diseño centrado en el usuario y la colaboración en la World Wide Web” . DHTML y Ajax son tecnologías para implementar estos conceptos. Dynamic HTML permite modificar la representación HTML de una página después de que esta página se haya cargado. Esto es posible mediante JavaScript y CSS que interactuan con el DOM ( Document Object Model ). Ajax es la tecnología usada en DHTML que permite interactuar al cliente con el servidor sin la necesidad de recargar la página. Ajax representa “ Asincrono JAvascript y Xml ”.
  • 63. Ajax Es importante saber que “asíncrono” no implica “instantáneo”. Ajax permite que mientras se realiza la petición asíncrona el usuario sigua visitando y realizando acciones sobre la página web. Por lo que es necesario que las peticiones Ajax que se realicen sean óptimas. Existen dos tipos de peticiones Ajax: Peticiones Pasivas: Están preparadas anticipando el futuro que se necesite. Peticiones Activas: Se realizan cuando se necesita saber de la acción que realiza el usuario.
  • 64. Optimización de las peticiones Ajax Las técnicas que se pueden emplear para optimizar peticiones Ajax son las mismas que las reglas que se han descrito: Regla 4: Componentes Gzip Regla 9: Busquedas DNS Regla 10: Minimizar Javascript Regla 11: Evitar Redirects Regla 13: Etag’s Pero la regla más importante para la optimización de las peticiones activas Ajax es cachear las respuestas (Regla 3). Cachear las peticiones Ajax es tan simple como modificar las cabeceras HTTP de la petición. Pero la naturaleza dinámica y personalizada de la respuesta debe reflejarse en lo que se cachea. La mejor manera de hacer esto es mediante los parámetros de la query.

Notas del editor

  • #2: - Moviendo los scripts al final permite una renderización progresiva y consigue una mayor ejecución de la descarga paralela.
  • #19: - Moviendo los scripts al final permite una renderización progresiva y consigue una mayor ejecución de la descarga paralela.
  • #20: El mayor impacto en el tiempo de respuesta viene dado por el número de componentes. Cada componente genera una HTTP request (cuando la cache está vacía o incluso cuando no está completamente llena).
  • #22: - En lugar de dejar en las manos del usuario que tenga que modificar el atributo network.http.max-persistent-connections-per-server del cliente navegador, es mejor que los ingenieros utilicen alias DNS. - Un estudio hecho para Yahoo! Muestra que si se utilizan más de dos alias el rendimiento es peor.
  • #23: Una razón es pq el script puede utilizar document.write para modificar la página. Por esta razón el navegador se espera a que la página esté compuesta adecuadamente. También para garantizar que los scripts se ejecuten en el orden correcto. Solución: ponerlos al final de la página.
  • #27: - La primera vez que se evalúa la expresión CSS, el javascript establece la propiedad explícitamente. De esta manera aunque se haga scroll o se mueva el ratón no se vuelve a evaluar.
  • #28: Evita la evaluación de la CSS expression durante eventos que no están relacionados. Interner Explorer no soporta la propiedad CSS min-width. Esta solución arregla el ancho de la página en el evento onresize.
  • #31: Las llamadas internas pueden ser más rápidas para ciertos casos ya que el estilo interno hace un http request por 3 (html, css, javascript) del externo. Pero si se cachea el css/js externos, el html será mucho más ligero y no habrá tantas http request.
  • #32: A menos archivos mejor. Un solo archivo hace solo una http request pero la primera vez que entra el usuario se descargará mucha información. Categorizar el site y hacer un archivo para cada categoría.
  • #34: - Casos en los que la home va a ser la primera página de muchas visitas a otras páginas. - Mezcla la interna con la externa. - La interna para la home y al cargar la home descarga los externos para posteriores páginas.
  • #36: Si el navegador supiera si un componente está en caché o no podría tomar la decisión de incluirlo interno o externo. Si está en caché sería externo sino sería interno. Esto lo hace inicializando la cookie en el estilo anterior. En el doOnload.
  • #39: time-to-live (TTL) Mientras el navegador tenga en caché lo que busca no va a preguntar al SO. Si el SO no puede satisfacer la petición del navegador, mandará una petición al servidor ISP, y aquí es donde se puede producir el aumento de tiempos. Por desgracia, las ips cambian, asi que hay que establacer una tiempo periódico donde se vacíe esta caché.
  • #40: El servidor devuelve junto con el registro DNS solicitido un TTL para esa petición, para indicar al cliente el periodo que la petición debe estar en caché. El sistema operativo toma este valor, pero el cada navegador establece sus propios TTL. Además de esto la propiedad Keep-Alive del protocolo HTTP puede sobre escribir los valores tanto del servidor como del navegador. Debido al alto número de usuarios de estos sites, estas compañías han decido poner unos TTL bajos para que en caso de fallo se redirija rápidamente a un servidor dns alternativo.
  • #41: IE: -Keep-Alive viene dado por el protocolo HTTP 1.0 donde se incluyó para poder realizar conexiones persistentes. Se puede indicar en el navegador o en el servidor. Tecnicamente en HTTP 1.1 Connection: Keep-Alive no es necesario. -ServerInfoTimeOut: indica que incluso sin el keep-alive, si el usuario hace una petición del mismo dns cada 2 minutos (sin ningún fallo en la petición), no hara falta de volver a enviar una dns lookup, incluso si has estado realizando peticiones cada 2 minutos durante más de 30 minutos tampoco hará falta. Esto es peligroso, pq si alguien actualiza su ip y el usuario sigue haciendo peticiones cada 2 minutos no refrescará al nuevo DNS. Firefox: -Al poner que la cache expire en un minuto incrementará el número de peticiones dns. -Poniendo solo 20 entradas en la cache perjudicará a los usuarios que hagan muchas visitas.
  • #42: Si la caché está vacía en el cliente, tendrá tantas peticiones DNS como hostnames tenga la web que solicita. Reducir el número de hostnames aumenta el número de descargas paralelas. Reducir las peticiones DNS reduce el tiempo de respuesta pero aumentando el número de descargas paralelas incrementa el tiempo.
  • #43: Es la práctica de eliminar caracteres innecesarios del código. Eliminar comentarios, espacios, nuevas líneas,tabs,etc. Al eliminar caracteres el peso de la descarga se reduce y por tanto el tiempo de descarga también.
  • #44: Problemas: - Al ser más complejo es más sensible a que se produzcan errores. - A veces elimina simbolos del javascript que deben permanecer. - Al ser más complejo es difícil de hacerle un debug.
  • #45: JSMin utiliza minimización y el Dojo Compressor ofuscación. Lo mejor es combinar la técnica de Gzip de la regla 4 y la minimización. Aplicar minimización a CSS es más fácil ya que no suelen llevar tantos comentarios ni espacios.