rendimiento

Mejorar el rendimiento de javascript con timers

Uno de mis últimos encargos consiste en una aplicación financiera para el navegador. En resumen, se trata de “traducir” una serie de hojas en Excel a javascript. El cómo lo he implementado da para otro artículo.

Básicamente el funcionamiento es el siguiente:

  • Creamos un campo de texto por cada celda del fichero Excel.
  • Muchas celdas tienen valores dinámicos, es decir, se generan a partir del valor de otras.
  • Definimos la fórmula que genera el valor de cada celda dinámica, y esa fórmula la añadimos a la pila de callbacks del evento ‘change’ de todas las celdas de las que depende.

Problema: Hay miles de celdas, prácticamente todas dinámicas. Esto implica que a menudo, al cambiar un sólo valor, se generan cientos o miles de cálculos. Javascript es single threaded, es decir, sólo se ejecuta una única hebra (para realizar cálculos, modificar el árbol DOM, gestionar eventos, o redibujar la pantalla). Si una operación muy costa en cálculos conlleva 8 segundos, la interfaz de usuario se quedará bloqueada hasta que finalice. Mal asunto.

El experto en usabilidad Jakob Nielsen dijo:

0,1 segundos es el límite para que el usuario perciba que el sistema responde inmediatamente.

El staff de PHP responde a los consejos de Google

Esta semana Google ha presentado (Estos tíos no paran) una serie de consejos para mejorar el rendimiento de nuestras páginas web. ¡Escalabilidad, escalabilidad, escalabilidad! Prácticamente no lo he leído, ya que imagino que la mayoría de los trucos serán muy similares a los que Yahoo! ofrece desde hace tiempo (Por cierto, viva Yslow :D (Tampoco he probado el equivalente de Google, Page Speed)).

Lo que sí he hecho es revisar por encima los consejos que Google ofrece sobre PHP. Hasta yo, que no conozco prácticamente nada de las entrañas de PHP, me he percatado de que esos consejos eran a menudo erróneos, bulos que circulan, o relativos a versiones de PHP muy antiguas.

El staff de PHP ha contestado

Resumen de lo que sí son hechos:

  1. Don’t copy variables for no reason – Falso. El Zend Engine hace que cuando copias una variable, ambas apuntan a lo mismo salvo que se realicen modificaciones. Por tanto, la memoria usada será y es la misma.
  2. Use single-quotes for strings – Falso. Hace tiempo que el rendimiento es prácticamente equivalente al usar dobles comillas que comillas simples (Personalmente uso comillas simples por costumbre desde tiempo ha).
  3. Use echo to print – No siempre es mejor.
  4. Don’t use concatenation with echo – Falso. Ocurre al revés. Es más efectiva la concatenación que el uso de múltiples argumentos.
  5. Use switch/case instead of if/else – Sin sentido. La diferencia entre uno y otro es de estilo, no de rendimiento.

En fin, al menos todos estos tips son de buena fé :)