Seleccionar página
benchmarkEn muchas ocasiones vamos a necesitar obtener el tiempo en el que se ejecuta una porción de código a fin de realizar algún tipo de análisis de rendimiento y optimización. Esta es una técnica básica, pero existen varias formas de abordar esta medición, con sus ventajas e inconvenientes.

Vamos a revisar a continuación algunas de ellas y veremos cómo se ajustan a las diferentes necesidades y situaciones que nos podemos encontrar a fin de seleccionar la que mejor se adapta a nuestro caso.

Actualización: si quieres ver algunas alternativas modernas a las técnicas aquí presentadas, puedes consultar Tiempo de alta precisión en Javascript.

Date.now()

Es método más habitual de medir el tiempo que se dedica a una porción de nuestro código es obtener la hora antes y después de su ejecución y calcular el tiempo que se ha consumido:

var start = Date.now();

// Lo que queremos medir
var a = new Array(10000000);
for (var n = 0; n < a.length; n++) {
    a[n] = n * n;
}
var end = Date.now();

console.log(end - start);

Sólo hay que tener en cuenta que Date.now() está disponible en navegadores algo modernos. Si queremos utilizar esta técnica con navegadores muy antiguos, debemos utilizar una función de este tipo para que funcione correctamente:

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}

El mayor inconveniente que tiene este método es que creamos nuevas variables dentro de nuestro programa, lo cual puede llegar a ser molesto y fuente de alguna confusión o error. No obstante, es un método sencillo y rápido que se utiliza muy a menudo.

Actualización: Consulta las diferencias entre Date.now() y el nuevo API performance.now() y comprueba como mejora la precisión a la hora de medir la ejecución de código.

console.time() y console.timeEnd()

Si utilizamos versiones modernas de los navegadores o Node.js, podemos hacer uso de una funcionalidad no estándar, pero muy útil que ofrece el objeto console. La ventaja de este método es que no creamos nuevas variables que puedan afectar a nuestro programa. Para ello simplemente tenemos que llamar a console.time(), pasando como parámetro un texto identificador, antes de la ejecución que queremos medir y llamar a console.timeEnd() con ese texto identificador al terminar la ejecución.

console.time('loop');

// Lo que queremos medir
var a = new Array(10000000);
for (var n = 0; n < a.length; n++) {
    a[n] = n * n;
}

console.timeEnd('loop'); // Muestra por consola: "loop: 63ms"

Una ventaja añadida del uso de console.time() y console.timeEnd() es que podemos tener varios timers simultáneamente, sólo tenemos que utilizar textos identificadores diferentes.

microprofiler

Es posible que estas técnicas de medición se nos queden un poco cortas en algunos casos, especialmente con Node.js, ya que tenemos que realizar la medición en un contexto más preciso o donde es conveniente medir la ejecución del código tras varias ejecuciones. Para solucionar este problema está el paquete microprofiler (npm, github) de Alex Fernández.

Este módulo permite hacer una medición muy precisa de una parte de nuestro código llamando a los métodos start() y measureFrom() antes y después del código que queremos medir.

var microprofiler = require('microprofiler');
var start = microprofiler.start();

// Lo que queremos medir
var a = new Array(10000000);
for (var n = 0; n < a.length; n++) {
    a[n] = n * n;
}

var elapsedUs = microprofiler.measureFrom(start);
console.log(elapsedUs);

Este módulo devuelve los datos en microsegundos, no en milisegundos como en los casos anteriores, lo cual es de gran utilidad si estamos haciendo microptimizaciones. Además de mayor precisión, este módulo tiene funcionalidades muy interesantes como poder medir el tiempo de ejecución cada n veces. De esta forma es posible incluir esta medición en procesos que se repiten de forma continuada en la ejecución y obtener datos sucesivos.

Profilers

No podemos terminar sin hacer una meción a las herramientas de profile que disponemos en navegadores o Node.js y que permiten capturar el tiempo de ejecución del código y mostrarlo de forma más o menos descriptiva. Esta aproximación mide todo el código en forma de arbol, es decir, se descompone el tiempo de ejecución en cada función llamada, y es muy diferente a la que hemos planteado aquí, ya que en los casos anteriores estamos midiendo una porción de código y con los profilers estamos midiendo todas las funciones.

Novedades

HTTP2 para programadores. Enviar mensajes del servidor al cliente con Server Sent Event (sin WebSockets)

HTTP2 para programadores. Enviar mensajes del servidor al cliente con Server Sent Event (sin WebSockets)

En esta charla, organizada por MadridJS, Pablo Almunia nos muestra cómo la mayoría de nosotros cuando oímos hablar por primera vez de HTTP2 nos ilusionamos con las posibilidades que presumiblemente se abrían para el desarrollo de soluciones web avanzadas y cómo muchos nos sentimos defraudados con lo que realmente se podía implementar.

En esta charla podemos ver cómo funciona el HTTP2, que debemos tener en cuenta en el servidor para hace uso de este protocolo y, sobre todo, cómo podemos enviar información desde el servidor al cliente de forma efectiva y fácil. Veremos con detenimiento cómo por medio de los Server-Sent Events (SSE) podemos recibir en el cliente datos enviados desde el servidor sin utilizar websocket, simplificando enormemente la construcción de aplicaciones con comunicación bidireccional.

Observables en Javascript con Proxies

Observables en Javascript con Proxies

En esta charla, organizada por MadridJS, Pablo Almunia nos habla de la observación reactiva de objetos en Javascript por medio de Proxy. Se describe paso a paso cómo funcionan los Proxies y en que casos pueden ser nuestro mejor aliado. Veremos que no hay que tenerles miedo, son bastante sencillos de utilizar, y nos ofrecen una gran abanico de posibilidades.

Aplicaciones JAMStack, SEO friendly y escalables con NextJS

Aplicaciones JAMStack, SEO friendly y escalables con NextJS

En esta charla de Madrid JS, Rafael Ventura nos describe las funcionalidades clave de NextJS, nos muestra en vivo cómo desarrollar una completa aplicación JAMStack con Server Side Rendering (SSR) y Static Site Generation (SSG) y termina mostrando como publicar esta aplicación en Vercel.

Stencil JS: mejora el Time To Market de tu producto, por Rubén Aguilera

Stencil JS: mejora el Time To Market de tu producto, por Rubén Aguilera

En esta charla Rubén Aguilera nos cuenta los problemas que tienen muchas empresas a la hora de sacar productos accesibles, vistosos y usables en el Time To Market que requiere Negocio y cómo podemos minimizar este tiempo gracias al DevUI con StencilJS para adecuar una aplicación de Angular a las exigencias del mercado en tiempo record.