Note: This article is a translation of What determines that a script is long-running? by Nicholas Zakas posted on January 5, 2009

Nota: Este artículo es una traducción de What determines that a script is long-running? escrito por Nicholas Zakas el 5 de Enero del 2009

¿Qué nos dice que nuestro código ha excedido el tiempo máximo de ejecución?

Uno de las principales obstáculos en programación que los desarrolladores web se encuentran constantemente es la temida ventana de alerta de tiempo máximo de ejecución del código. Estos dichosos diálogos se muestran cada vez que el código Javascript tarda demasiado tiempo en ejecutarse. La máxima en programación web es que un usuario nunca tendría que ver esta ventana ya que indica una falta de una buena arquitectura en el código Javascript. Por decirlo en simples palabras: el código esta intentando hacer más de la cuenta.

Brendan Eich, el creador de Javascript, dice: "Si la ejecución de Javascript dura varios segundos es que posiblemente se esté haciendo algo mal...". Mi limite personal es incluso más reducido: En ningún momento un fragmento de código debería durar más de 100 milisegundos en cualquier navegador. Si dura más, se debe dividir el proceso en partes más pequeñas.

Aun y así, pocos desarrolladores web realmente entienden que es lo que provoca estas ventanas de error en los diferentes navegadores, incluyéndome a mí también. Es por ello que decidí sentarme y averiguar bajo que circunstancias se muestran estas ventanas. Hay básicamente dos distintas formas de saber si un determinado código puede exceder el tiempo máximo de ejecución. La primera consiste en analizar cuantas instrucciones han sido ejecutadas y la segunda consiste en medir cuanto dura la ejecución del código. Como es de esperar, el comportamiento de cada navegador difiere ligeramente.

Internet Explorer (IE) considera que el código excederá el tiempo máximo de ejecución basándose en el total de instrucciones que el interprete de JScript ejecuta. El valor en la configuración de serie es de cinco millones de instrucciones y puede ser cambiado mediante la configuración del registro. Cuando el código supere este máximo numero de instrucciones se mostrara la siguiente ventana:

IE Dialog: A script on this page is causing Internet Explorer to run slowly. If it continues to run, your compute may become unresponsive.

El mensaje: "El código de esta pagina esta causando que Internet Explorer se ejecute muy lentamente. Si el código continua ejecutándose su computadora podría dejar de responder" es un poco severo y técnicamente poco preciso. Las opciones que tenemos son detener el código o permitir que continúe ejecutándose. La ejecución del código estará totalmente parada mientras la ventana se muestra en pantalla. Si se selecciona la opción de continuar ejecutando el código el contador de instrucciones ejecutadas se reiniciara a cero y la ventana se mostrara de nuevo si el numero de instrucciones alcanza el máximo otra vez.

Firefox considera que el código excede el tiempo máximo de ejecución basándose en el tiempo en que el código corre de forma continua. El tiempo configurado de serie esta establecido en diez segundos y puede ser modificado mediante about:config. Nótese que los segundos que pasan mientras se muestran las ventanas de dialogo, como por ejemplo las alertas, no cuentan como tiempo de ejecución de código por parte del interprete. Cuando se alcanza ese tiempo de ejecución Firefox muestra una ventana con el siguiente mensaje:

Firefox Dialog: A script on this page may be busy, or it may have stopped responding. You can stop the script now, open the script in the debugger, or let the script continue.

El mensaje de Firefox: "El código de esta pagina aun esta procesando o puede que haya dejado de responder. Ud. puede detener el código ahora, abrir el código en el depurador, o bien dejar que continúe" es un poco más descriptivo y discutiblemente menos brusco que el de IE. Las opciones en esta ventana son las de parar el código, depurarlo o permitir que continúe. Tal y como sucede con Internet Explorer, si se escoge la opción de continuar, el contador de tiempo de ejecución será reiniciado. El botón de "depurar código" solo aparece si se tiene Firebug instalado y activo en la pagina, esta opción muestra el código que esta causando el problema en Firebug.

Safari también utiliza el tiempo de ejecución del interprete como referencia para considerar que el código excede el tiempo máximo establecido. Después de indagar un poco en el código fuente de Webkit parece que el tiempo máximo de serie es de cinco segundos. Cuando este limite es alcanzado se muestra la siguiente ventana:

Safari Dialog: A script on the page [url] is making Safari unresponsive. Do you want to continue running the script, or stop it?

El mensaje aquí es: "El código de la pagina esta provocando que Safari no responda. ¿Quiere que el código se continúe ejecutando o quiere Ud. detenerlo?" De nuevo, esto no es lo mejor que un usuario podría leer. No obstante, se puede desactivar la detección de tiempo máximo establecido seleccionando Disable Runaway Javascript Timer en el menú Develop.

Chrome es un poco más complicado de depurar. La detección de tiempo máximo de ejecución parece estar ligado al control de fallo para cada pestaña. Después de hacer una incursión en el código fuente, personalmente no he podido encontrar el limite exacto, pero parece que esta basado en un tiempo de ejecución de diez segundos (probablemente cinco o diez para coincidir con Safari o Firefox). Estoy intentando contactar con alguien de su equipo para confirmarlo. En cualquier caso, se mostrara la siguiente ventana:

Chrome Dialog: Chrome Dialog: The following page(s) have become unresponsive. You can wait for them to become responsive or kill them.

Claramente, la ventana de Chrome es un poco más malicioso que en otros navegadores. Si se selecciona 'wait' la pagina continuara su proceso hasta que el siguiente tiempo máximo sea alcanzado. Seleccionando 'kill pages' se elimina toda la pagina de la memoria y es substituida por una nueva.

Opera es un caso interesante: no parece que tenga un limite en el tiempo máximo de ejecución. He probado con varios casos que finalizaban después de varios minutos de ejecución. Durante ese tiempo el navegador respondía casi con absoluta normalidad, lo cual tiene merito. No estoy seguro de que esta opción sea buena o mala pero por el momento es lo que hay.

Sea cual sea el navegador que se este usando, los usuarios nunca deberían ver este tipo de ventanas. Es muy importante que se hagan a menudo pruebas de rendimiento de tu pagina o aplicación web antes de ponerlos al publico. Hay diversas herramientas que se pueden utilizar como el profiler de Firebug (Firefox), el profiler de YUI (todos los navegadores), y el profiler de Internet Explorer 8. Deberías fijarte en cualquier parte del código que su ejecución tarde cien milisegundos o más en cualquier navegador. Los métodos involucrados en una ejecución tan larga deberían ser evaluados como problemas de rendimiento. Asegúrate de que no usas Chrome como referencia ya que la ejecución de su Javascript es unas cuantas magnitudes más rápida que en otros (lo mismo para Firefox 3.1 y las más recientes distribuciones de Webkit). Es mejor utilizar Internet Explorer como referencia y después comprobar el resto de navegadores ya que IE es normalmente el interprete de Javascript más lento. Corregir errores en IE corregirá seguramente los problemas en otros navegadores.

¿Te gustó éste artículo?

Entonces prueba con: Professional JavaScript, 2nd Edition. Completamente nuevo y actualizado para 2009! En Facebook? Hazte fan.