Es una técnica utilizada para medir el rendimiento de un sistema o componente del mismo.
La palabra benchmark es un anglicismo traducible al español como comparativa.
Es en el campo informático donde su uso está más ampliamente extendido.
Es el resultado de la ejecución de un programa informático o un conjunto de programas en una máquina, con el objetivo de estimar el rendimiento de un elemento concreto, y poder comparar los resultados con máquinas similares.
La elección de las condiciones bajo la cual dos sistemas distintos pueden compararse entre sí es especialmente ardua, y la publicación de los resultados suele ser objeto de candentes debates cuando éstos se abren a la comunidad.
Sintéticos vs Aplicaciones
Bajo nivel vs Alto nivel
Otros
Se suelen realizar benchmarks sobre servidores web para evaluar la cantidad de respuestas por segundo que pueden entregar o lo que demora una respuesta.
También sobre frameworks, ya sea para evaluar una parte del mismo o el framework entero.
Incluso, se utilizan para evaluar pequeños trozos de código de un sistema que son importantes ya que forman parte del núcleo. Generalmente, todo código que se ejecuta muy frecuentemente. Se miden desde funciones enteras hasta sentencias de una sola línea.
Es fundamental que el entorno en donde se realizan los benchmarks esté totalmente aislado y no influya en los resultados de los tests. Tampoco debe cambiar de estado entre ejecuciones de los tests.
Se deben realizar múltiples mediciones y luego obtener un promedio de ellas.
jsPerf aims to provide an easy way to create and share test cases, comparing the performance of different JavaScript snippets by running benchmarks.
Permite crear y compartir tests en Javascript.
function hola(param) {
console.log(param);
}
hola('hola');
const hola = function(param) {
console.log(param);
}
hola('hola');
Muchos benchmarks son realizados por personas que no tienen en cuenta el entorno en que se ejecutan o que se dejan llevar por el fanatismo.
Brindan poca información de cómo realizaron los tests y con qué herramientas específicas de cada lenguaje (librerías, frameworks, intérpretes o compiladores, étc.).
Los benchmarks no definen si una herramienta es mejor que otra, ya que solamente consideran algunos puntos importantes aislando los demás, y esto determina que una herramienta funciona mejor que otra solamente en los casos que las mediciones evaluaron.
const http = require('http');
const port = 3000;
const requestHandler = (request, response) => {
response.end('Hello Node.js Server!');
}
const server = http.createServer(requestHandler);
server.listen(port, () => {
console.log(`Escuchando en el puerto ${port}`);
});
const express = require('express');
const app = express();
app.get('/', function (req, res) {
res.send('Administración de Recursos');
});
app.listen(3000, function () {
console.log('Escuchando en el puerto 3000');
});
const restify = require('restify');
var server = restify.createServer();
server.get('/', function(req, res, next) {
res.send('Administración de Recursos');
next();
});
server.listen(3000, function() {
console.log('Escuchando en el puerto 3000');
});
Se corre un benchmarking, levantando los servidores con los distintos frameworks uno a uno.
$ ab -r -n 100000 -c 1000 http://localhost:3000/
HTTP nativo
Server Hostname: localhost
Server Port: 3000
Document Path: /
Document Length: 27 bytes
Concurrency Level: 1000
Time taken for tests: 3.894 seconds
Complete requests: 100000
Failed requests: 0
Total transferred: 10200000 bytes
HTML transferred: 2700000 bytes
Requests per second: 25683.01 [#/sec] (mean)
Time per request: 38.936 [ms] (mean)
Time per request: 0.039 [ms] (mean, across all concurrent requests)
Transfer rate: 2558.27 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 21 162.5 0 3118
Processing: 1 10 33.6 7 1659
Waiting: 1 10 33.6 7 1659
Total: 2 31 182.8 7 3332
Express
Server Hostname: localhost
Server Port: 3000
Document Path: /
Document Length: 27 bytes
Concurrency Level: 1000
Time taken for tests: 27.256 seconds
Complete requests: 100000
Failed requests: 0
Total transferred: 22700000 bytes
HTML transferred: 2700000 bytes
Requests per second: 3668.87 [#/sec] (mean)
Time per request: 272.564 [ms] (mean)
Time per request: 0.273 [ms] (mean, across all concurrent requests)
Transfer rate: 813.31 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 35 205.7 0 3203
Processing: 8 65 910.1 12 26246
Waiting: 8 65 910.1 12 26246
Total: 9 100 985.8 12 27253
Restify
Server Hostname: localhost
Server Port: 3000
Document Path: /
Document Length: 29 bytes
Concurrency Level: 1000
Time taken for tests: 14.243 seconds
Complete requests: 100000
Failed requests: 0
Total transferred: 17300000 bytes
HTML transferred: 2900000 bytes
Requests per second: 7020.79 [#/sec] (mean)
Time per request: 142.434 [ms] (mean)
Time per request: 0.142 [ms] (mean, across all concurrent requests)
Transfer rate: 1186.13 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 44 223.0 0 3149
Processing: 8 33 401.2 11 13209
Waiting: 8 33 401.2 11 13209
Total: 9 77 499.7 11 14237
Benchmarks de API en NodeJS:
aboglioli/simple-node-frameworks-benchmarks
Estas diapositivas: