You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
David Benjamin f3af453ae0
crypto: fix Node_SignFinal
7 years ago
..
arrays benchmark: convert var to es6 const 7 years ago
assert benchmark: add assert.deep[Strict]Equal benchmarks 8 years ago
buffers tools: remove legacy indentation linting 7 years ago
child_process tools: remove legacy indentation linting 7 years ago
crypto crypto: fix Node_SignFinal 7 years ago
dgram benchmark: fix dgram/bind-params.js benchmark 7 years ago
domain benchmark: fix lint errors 9 years ago
es benchmark: reformat code for clarity 8 years ago
events benchmark: refactor to eliminate redeclared vars 9 years ago
fixtures src: replace naive search in Buffer::IndexOf 9 years ago
fs benchmark: fix fs\bench-realpathSync.js 8 years ago
http benchmark: use smaller n value in some http tests 7 years ago
misc addons: remove semicolons from after module definition 8 years ago
module benchmark: add final clean-up to module-loader.js 8 years ago
net benchmark,windows: TCP.readStart() meaningful only after completion 8 years ago
os os: improve loadavg() performance 8 years ago
path tools,benchmark: increase lint compliance 9 years ago
process process: improve memoryUsage() performance 8 years ago
querystring querystring: improve unescapeBuffer performance 8 years ago
streams stream: avoid additional validation for Buffers 8 years ago
string_decoder string_decoder: rewrite implementation 9 years ago
timers benchmark: add more thorough timers benchmarks 8 years ago
tls benchmark: reformat code for clarity 8 years ago
url benchmark: add benchmark for url.format() 9 years ago
util benchmark: fix typo in inspect-proxy 7 years ago
README.md tools: remove legacy indentation linting 7 years ago
common.js tools: update ESLint to current version 8 years ago
compare.js benchmark: fix lint errors 9 years ago
fs-write-stream-throughput.js buffer: add .from(), .alloc() and .allocUnsafe() 9 years ago
http-flamegraph.sh node: rename from io.js to node 9 years ago
http.sh node: rename from io.js to node 9 years ago
http_bench.js tools,benchmark: increase lint compliance 9 years ago
http_server_lag.js tools,benchmark: increase lint compliance 9 years ago
http_simple.js benchmark: reformat code for clarity 8 years ago
http_simple.rb fix whitespace errors 15 years ago
http_simple_auto.js benchmark: fix linting errors 9 years ago
http_simple_bench.sh meta: remove use of profanity in source 9 years ago
http_simple_cluster.js benchmark: fix lint errors 9 years ago
idle_clients.js test,benchmark: fix lint errors on v6.x 8 years ago
idle_server.js tools,benchmark: increase lint compliance 9 years ago
io.c bench: Make io.c output easier to read 12 years ago
plot.R node: rename from io.js to node 9 years ago
plot_csv.R node: rename from io.js to node 9 years ago
report-startup-memory.js benchmark: use strict mode 9 years ago
static_http_server.js benchmark: remove unused variables 9 years ago

README.md

Node.js core benchmark tests

This folder contains benchmark tests to measure the performance for certain Node.js APIs.

Prerequisites

Most of the http benchmarks require wrk and ab (ApacheBench) being installed. These may be available through your preferred package manager.

If they are not available:

  • wrk may easily be built from source via make.
  • ab is sometimes bundled in a package called apache2-utils.

How to run tests

There are three ways to run benchmark tests:

Run all tests of a given type

For example, buffers:

node benchmark/common.js buffers

The above command will find all scripts under buffers directory and require each of them as a module. When a test script is required, it creates an instance of Benchmark (a class defined in common.js). In the next tick, the Benchmark constructor iterates through the configuration object property values and runs the test function with each of the combined arguments in spawned processes. For example, buffers/buffer-read.js has the following configuration:

var bench = common.createBenchmark(main, {
  noAssert: [false, true],
  buffer: ['fast', 'slow'],
  type: ['UInt8', 'UInt16LE', 'UInt16BE',
         'UInt32LE', 'UInt32BE',
         'Int8', 'Int16LE', 'Int16BE',
         'Int32LE', 'Int32BE',
         'FloatLE', 'FloatBE',
         'DoubleLE', 'DoubleBE'],
  millions: [1]
});

The runner takes one item from each of the property array value to build a list of arguments to run the main function. The main function will receive the conf object as follows:

  • first run:
{   noAssert: false,
    buffer: 'fast',
    type: 'UInt8',
    millions: 1
}
  • second run:
{   noAssert: false,
    buffer: 'fast',
    type: 'UInt16LE',
    millions: 1
}

...

In this case, the main function will run 2214*1 = 56 times. The console output looks like the following:

buffers//buffer-read.js
buffers/buffer-read.js noAssert=false buffer=fast type=UInt8 millions=1: 271.83
buffers/buffer-read.js noAssert=false buffer=fast type=UInt16LE millions=1: 239.43
buffers/buffer-read.js noAssert=false buffer=fast type=UInt16BE millions=1: 244.57
...

The last number is the rate of operations. Higher is better.

Run an individual test

For example, buffer-slice.js:

node benchmark/buffers/buffer-read.js

The output:

buffers/buffer-read.js noAssert=false buffer=fast type=UInt8 millions=1: 246.79
buffers/buffer-read.js noAssert=false buffer=fast type=UInt16LE millions=1: 240.11
buffers/buffer-read.js noAssert=false buffer=fast type=UInt16BE millions=1: 245.91
...

Run tests with options

This example will run only the first type of url test, with one iteration. (Note: benchmarks require many iterations to be statistically accurate.)

node benchmark/url/url-parse.js type=one n=1

Output:

url/url-parse.js type=one n=1: 1663.74402

How to write a benchmark test

The benchmark tests are grouped by types. Each type corresponds to a subdirectory, such as arrays, buffers, or fs.

Let's add a benchmark test for Buffer.slice function. We first create a file buffers/buffer-slice.js.

The code snippet

var common = require('../common.js'); // Load the test runner

var SlowBuffer = require('buffer').SlowBuffer;

// Create a benchmark test for function `main` and the configuration variants
var bench = common.createBenchmark(main, {
  type: ['fast', 'slow'], // Two types of buffer
  n: [512] // Number of times (each unit is 1024) to call the slice API
});

function main(conf) {
  // Read the parameters from the configuration
  var n = +conf.n;
  var b = conf.type === 'fast' ? buf : slowBuf;
  bench.start(); // Start benchmarking
  for (var i = 0; i < n * 1024; i++) {
    // Add your test here
    b.slice(10, 256);
  }
  bench.end(n); // End benchmarking
}