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

Desarrollando Skills Alexa con AWS Lambda y node.js por Germán Viscuso

Germán Viscuso, evangelista de la tecnología Alexa para España, nos cuenta en esta charla las posibilidades nos ofrece la tecnología de Amazon para crear Skills personalizados desarrollados en NodeJS y desplegados en Lamdas de AWS. Un nuevo mundo de posibilidades para los desarrolladores.

Native apps with Titanium por Rene Pot

Rene Pot nos cuenta cómo crear apps nativas con Titanium + Alloy y sacar el máximo partido en el desarrollo de aplicaciones nativas desde un único código fuente basado en Javascript.

10 patrones de diseño para Node por Felipe Polo

Los diez patrones de diseño para Javascript presentados por Felipe Polo en esta interesante charla te ayudarán a crear un código más legible, mantenible y comunicativo. Son un buen punto de partida para hacer mejor tus programas.