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

Clases: miembros estáticos

Los constructores pueden tener miembros estáticos, es decir, métodos y propiedades que residen en el objeto que es la función constructora. Veamos cómo funcionan.

Clases: métodos de acceso y datos privados

Los métodos get/set para controlar el acceso a los datos son uno de los mecanismos que nos ofrece Javascript para mantener nuestros datos fuera de miradas inadecuadas. Esta funcionalidad, junto con WeakMap nos permite implementar una protección bastante razonable de los datos. Veamos cómo…

Clases: métodos

Los métodos son una de las partes más importantes de las clases, en ellos incluimos las funciones que queremos que trabajen sobre nuestro objeto. Los métodos tienen un modelo específico de definición y funcionamiento.

Clases: propiedades

Las propiedades son un elemento básico de los objetos y las clases. Podemos definirlos de varias formas, tanto en el objeto como en el constructor y especificar su comportamiento con precisión. Veamos cómo.