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

El fin de una era: Microsoft Edge se une a Chromium

El fin de una era: Microsoft Edge se une a Chromium

Microsoft Edge utiliza desde hoy Chromium como base de su desarrollo, por lo que en la práctica da soporte a prácticamente todas los estándares y tecnologías que Google Chrome. Después de tantos años desarrollando tecnologías propias, Microsoft se rinde y se une al navegador más extendido. Parece increíble, pero es cierto.

Datos inmutables en Javascript

Datos inmutables en Javascript

En Javascript todo parece mutable, es decir, que se puede cambiar, pero lo cierto es que también nos ofrece varios mecanismos para conseguir que los datos que manejamos, especialmente los objetos, sean inmutables. Te invitamos a descubrir cómo…

Copiar objetos en Javascript

Copiar objetos en Javascript

Copiar objetos no es algo sencillo, incluso se podría decir que en si mismo no es posible, ya que el concepto «copiar» no entra dentro del paradigma de los objetos. No obstante, por medio de instrucciones como Object.assign() hemos aprendido como obtener objetos con las mismas propiedades, pero está técnica no se puede aplicar a todos los tipos de objetos disponibles en Javascript. Vamos a ver cómo podemos copiar cualquier tipo de objeto…

Descubre los Javascript Array Internals

Descubre los Javascript Array Internals

El Array es una de las estructuras más utilizadas en Javascript y no siempre bien comprendida. Hoy os invitamos a analizar el comportamiento interno de este objeto y descubrir cómo Javascript implementa las diferente acciones con los Array y que operaciones internas se realizan en cada caso.