¿Cómo reducir el impacto de una extensión al iniciar Firefox?

8 junio, 2012 15:33 por

En Mozilla estamos trabajando para mejorar el desempeño de Firefox y para que cada versión nueva sea notablemente más rápida que la anterior, aunque Firefox ya es bastante veloz. Pueden comprobarlo creando un perfil nuevo y así verán cómo funciona Firefox recién instalado. Lo cierto es que el rendimiento de Firefox se va ralentizando con el tiempo y uno de los factores que más contribuyen a ésto son los complementos que se instalan.

Para la mayoría de desarrolladores es difícil percibir el impacto que tiene una extensión en Firefox. Cuando probamos nuestros complementos en un perfil de pruebas, no hay una gran diferencia entre tener o no tener el complemento instalado. La diferencia se produce con perfiles de5 ó 6 complementos, algo bastante común.

Son varias las áreas de desempeño donde los complementos influyen de manera negativa en Firefox, pero este artículo se centra en una de las más molestas: la velocidad de carga. Hay pocas cosas más frustrantes que hacer doble click en el icono y esperar, esperar y esperar… ¡Algunas personas lo hacen durante varios minutos! A continuación, un análisis de  cómo medir este impacto y cómo minimizarlo.

Midiendo la velocidad de carga

Este artículo, en inglés, detalla muy bien cómo hacerlo.

Hay dos maneras sencillas de medir cuánto tiempo conlleva iniciar Firefox. Una es utilizar el sistema de pruebas Talos y hacer un par de cambios de configuración para que pueda cargar con un complemento preinstalado. La otra es instalar el complemento About Startup. En ambos casos lo que queremos es iniciar Firefox en múltiples ocasiones, con y sin el complemento instalado, midiendo el tiempo de carga en cada ocasión. El Talos automatiza muchos de estos pasos, por lo que es mi método preferido.

A la hora de hacer las pruebas es importante procurar la consistencia de los resultados. Para eso, yo cierro todas las demás aplicaciones y servicios que sean pesados, para que no influyan en los resultados. También suelo eliminar la carga más lenta de los conjuntos de resultados, porque suele ser notablemente más alta, y es el  producto de algún proceso en el sistema operativo. Si no se elimina, los promedios se pueden desviar mucho de la realidad.

Caso de estudio: Fire.fm

Cuando escribí por primera vez sobre ésto hace dos años, decidí utilizar mi propia extensión como un caso de prueba. Fire.fm es una extensión más o menos compleja, pero yo creí que su código estaba bastante bien organizado y optimizado. Los resultados me sorprendieron.

En su momento hice pruebas en Mac OS X 10.6.3 y estos fueron los resultados:

Firefox 3.6.4, perfil limpio: 703.1 ms

Firefox 3.6.4, con Fire.fm 1.4.4: 919.2 ms

Así que esa versión agregaba más de 210 milisegundos al inicio de Firefox, alrededor del 30%. Con 5 complementos similares instalados, la carga sería un segundo más lenta. Me pareció inaceptable y me puse a trabajar.

Después de hacer un par de cambios sencillos, llegué al siguiente resultado:

Firefox 3.6.4, con Fire.fm 1.4.5 (dev): 760 ms

La nueva versión agrega solo 57 milisegundos a la carga del Firefox, el 8% adicional. ¿Cómo no había hecho esto antes?

Cómo reducir el impacto

Vamos a lo importante: ¿Qué hice para mejorar el desempeño de mi extensión? Esto es lo que descubrí y lo que recomiendo:

  1. No cargar o ejecutar código antes de que sea necesario. Las extensiones normalmente tienen funcionalidades extra que solo se activan con preferencias o cuando el usuario está autenticado con un servicio. Nunca carguen algo que no se va a necesitar inmediatamente. Esto lleva al punto #2:
  2. Usar módulos de JavaScript. Esta es la mejor manera de dividir el código en secciones que se pueden cargar de forma dinámica. Los scripts de Chrome normalmente se cargan como parte del overlay durante el proceso de inicio, haciendo que la carga de Firefox sea más lenta. Mantengan la mayoría de su código en módulos de JS, lo más modular posible y solo carguen los módulos cuando los vayan a necesitar.
  3. Hacer lo menos posible en el evento load. La mayoría de las extensiones tienen un manejador de eventos para el load del overlay, el cual se utiliza para ejecutar funciones de inicialización. Lo que se deben preguntar es lo siguiente: ¿Hay algo en esas funciones que no se pueda ejecutar 100 ms o incluso 500 ms después? En la mayoría de los casos, este código se puede ejecutar después y para eso recomiendo usar un nsITimer, la función setTimeout.

Así que en vez de esto:

window.addEventListener(

  "load",

  function() { MiExtension.cargar(); },

  false);

Se tiene esto:

window.addEventListener(

  "load",

  function() { window.setTimeout(function() { MiExtension.cargar(); }, 500) },

  false);

El código corre medio segundo más tarde, antes que el usuario lo note. Y sin embargo, este cambio tan pequeño es el que tuvo más impacto en mi extensión. Atrasar la carga del código eliminó la mayoría de su impacto en la velocidad de inicio de Firefox.

Cabe notar que estas recomendaciones son para extensiones tradicionales hechas con XUL, por lo que no son muy útiles para extensiones hechas con el nuevo SDK. El SDK se encarga del proceso de inicialización, así que no hay mucho que se pueda hacer para reducir tiempos de arranque. Cuando escribí este artículo por primera vez hace dos años, las extensiones que usaban el SDK eran de las más lentas, pero gracias al trabajo de muchas personas ese ya no es el caso.

Espero que esto les ayude a crear extensiones con un impacto mínimo. En un artículo futuro hablaré cómo detectar leaks y uso excesivo de memoria en complementos.

The following two tabs change content below.

jorgev

Add-ons Developer Relations Lead at Mozilla
Jorge trabaja para el equipo de complementos de Mozilla, y se dedica a Mozilla Hispano y Mozilla Costa Rica en su tiempo libre. Actualmente está encargado del blog de Mozilla Hispano Labs.

Compartir artículo:

  • ¡Participa!

    Firefox Friends »
    Agrega botones de Firefox en tu sitio web y comparte tu amor por Mozilla Firefox.
    Armada alucinante »
    Ayuda a otros usuarios en Twitter.
    Colabora con la comunidad »
    En Mozilla lo importante son las personas. Descubre cómo puedes colaborar.

    Boletín Firefox

    Suscríbete al boletín de novedades de Firefox.

  • Descargas

    Descarga los programas de Mozilla.

    Lo más visto

    cc-by-sa