Seleccionar página

benchmarkjsEs importante conocer que patrones, funcionalidades del lenguaje, funciones o librerías son más rápidas. En gran medida la velocidad de nuestros sistemas y aplicaciones depende de una serie elecciones durante la construcción y desarrollo. Para poder decir que opción es la más rápida podemos utilizar un sencillo método, medimos la ejecución de cada código y comparamos los resultados.

Para ello podemos utilizar las técnicas que mostramos en ¿Cómo medir el rendimiento de un código Javascript? o podemos utilizar algunos de los paquetes o librerías que ofrece un marco de comparación de rendimiento estable y optimizado, que simplifica la comparación. Vamos a ver uno de estos paquetes.

BenchmarkJS

El paquete BenchmarkJS ha sido desarrollado para la Mesa Redonda: Rendimiento en EcmaScript 6 con las contribuciones realizadas en la lista de discusión de Node.js Madrid. Sus principales características son:

  • Este paquete permite medir el número de veces que se puede ejecutar un determinado código en un segundo y de esta forma permite conocer el rendimiento de esa función con mucha precisión. Medir el número de ejecuciones en vez del tiempo de ejecución facilita la comparación de mediciones, ya que en el caso de medir el tiempo deberíamos tener en cuenta el número de iteraciones que estamos utilizando.
  • Para estar seguros que estamos haciendo una medición correcta hace una primera prueba que indica el número de veces que se debe comprobar la velocidad de ejecución y de esta forma evitar tener que medir continuamente y producir una interferencia no deseada sobre el proceso. De esta forma se minimiza el número de veces que tenemos que comprobar la velocidad.
  • Gestiona el código a probar de tal forma que no se produzca efectos de optimización no deseados que puedan falsear los resultados de forma significativa. Por ejemplo, el primer código que probemos es fácilmente optimizable, frente al segundo código, lo cual nos puede dar un resultado erróneo. Este paquete evita estas circunstancias.

Como vamos a ver a continuación es extremadamente sencillo de utilizar y es un codigo muy sencillo y compacto que se puede modificar con facilidad si fuera necesario (ver el código en Github). Está inspirada en el paquete benchmark, pero es todavía más sencilla de utilizar.

Instalación

Para instalar con NPM utilizaremos:

npm install benchmarkjs --save-dev

Este paquete no tiene dependencias.

Si lo necesitamos también se puede obtener de Github con:

git clone https://github.com/todojs/BenchmarkJS.git

Uso

Su uso es muy sencillo. Para utilizarlo en un navegador tenemos que cargar la librería con:

Si lo queremos utilizar en Node.js debemos utilizar:

var Benchmark = require('benchmarkjs');

Ejemplo

Este es un ejemplo muy sencillo de su uso:

var benchmarkjs = require('benchmarkjs');

benchmarkjs.options({
    testTime: 4000
});

var bigArray1 = new Array(1000);
benchmarkjs('n < max', function () {
    for (var n = 0, max = bigArray1.length; n < max; n++) {
        bigArray1[n] = 0 | Math.random() * 1000;
    }
});

var bigArray2 = new Array(1000);
benchmarkjs('n < hugeArray2.length', function () {
    for (var n = 0; n < bigArray2.length; n++) {
        bigArray2[n] = 0 | Math.random() * 1000;
    }
});

console.log(benchmarkjs.results);

El resultado será similar a este:

[ { name: 'n < max',              // Nombre del test
    elapsed: 4395,                // Tiempo total del text
    checks: 2,                    // Número de comprobaciones en el test
    totalIterations: 484811,      // Número total de ejecuciones
    persecondIterations: 110309,  // Ejecuciones por segundo
    isOptimized: null,            // Sólo si Node.js se ejecuta con 
                                  // --allow-natives-syntax
    diff: '0%' },                 // Diferencia con el mejor caso
  { name: 'n < hugeArray2.length',
    elapsed: 4325,
    checks: 2,
    totalIterations: 475535,
    persecondIterations: 109950,
    isOptimized: null,
    diff: '0.33%' } ]

Configuración

El paquete ofrece una función options() con la que configurar algunos parámetros de la prueba que vamos a realizar. Las opciones son:

benchmarkjs.options({
    testTime: 4000,          // Tiempo en milisegundos de ejecución. 
                             // Por defecto: 3000 ms.
    verbose: true,           // Muestra un mensaje por consola en cada 
                             // prueba. Por defecto: false.
    maxIterations: 1e6,      // Número máximo de ejecuciones. 
                             // Por defecto: 0x3FFFFFFF (1073741823).
    preTestIterations: 3000  // Número de ejecuciones previas para calcular 
                             // las comprobaciones. Por defecto: 1000.
});

Comprobar la optimización de v8

Este paquete tiene una interesante funcionalidad que nos permite conocer si una función será optimizada por el motor v8. Para que esta funcionalidad esté activa debemos arrancar Node.js con este parámetro:

node --allow-natives-syntax

Los posibles valores para isOptimized son:

1 – “optimized”
2 – “not optimized”
3 – “always optimized”
4 – “never optimized”
6 – “maybe deoptimized”
7 – “turbofan optimized”

Veremos varios ejemplos del uso de este paquete en una futura entrada sobre las pruebas que hemos realizado para analizar el rendimiento de ES6 en Node 4.

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.