# Node.js Core Benchmarks

This folder contains code and data used to measure performance
of different Node.js implementations and different ways of
writing JavaScript run by the built-in JavaScript engine.

For a detailed guide on how to write and run benchmarks in this
directory, see [the guide on benchmarks](../doc/contributing/writing-and-running-benchmarks.md).

## Table of Contents

* [Benchmark directories](#benchmark-directories)
* [Common API](#common-api)

## Benchmark Directories

| Directory       | Purpose                                                                                                          |
| --------------- | ---------------------------------------------------------------------------------------------------------------- |
| assert          | Benchmarks for the `assert` subsystem.                                                                           |
| buffers         | Benchmarks for the `buffer` subsystem.                                                                           |
| child\_process  | Benchmarks for the `child_process` subsystem.                                                                    |
| crypto          | Benchmarks for the `crypto` subsystem.                                                                           |
| dgram           | Benchmarks for the `dgram` subsystem.                                                                            |
| domain          | Benchmarks for the `domain` subsystem.                                                                           |
| es              | Benchmarks for various new ECMAScript features and their pre-ES2015 counterparts.                                |
| events          | Benchmarks for the `events` subsystem.                                                                           |
| fixtures        | Benchmarks fixtures used in various benchmarks throughout the benchmark suite.                                   |
| fs              | Benchmarks for the `fs` subsystem.                                                                               |
| http            | Benchmarks for the `http` subsystem.                                                                             |
| http2           | Benchmarks for the `http2` subsystem.                                                                            |
| misc            | Miscellaneous benchmarks and benchmarks for shared internal modules.                                             |
| module          | Benchmarks for the `module` subsystem.                                                                           |
| net             | Benchmarks for the `net` subsystem.                                                                              |
| path            | Benchmarks for the `path` subsystem.                                                                             |
| perf\_hooks     | Benchmarks for the `perf_hooks` subsystem.                                                                       |
| process         | Benchmarks for the `process` subsystem.                                                                          |
| querystring     | Benchmarks for the `querystring` subsystem.                                                                      |
| streams         | Benchmarks for the `streams` subsystem.                                                                          |
| string\_decoder | Benchmarks for the `string_decoder` subsystem.                                                                   |
| timers          | Benchmarks for the `timers` subsystem, including `setTimeout`, `setInterval`, .etc.                              |
| tls             | Benchmarks for the `tls` subsystem.                                                                              |
| url             | Benchmarks for the `url` subsystem, including the legacy `url` implementation and the WHATWG URL implementation. |
| util            | Benchmarks for the `util` subsystem.                                                                             |
| vm              | Benchmarks for the `vm` subsystem.                                                                               |

### Other Top-level files

The top-level files include common dependencies of the benchmarks
and the tools for launching benchmarks and visualizing their output.
The actual benchmark scripts should be placed in their corresponding
directories.

* `_benchmark_progress.js`: implements the progress bar displayed
  when running `compare.js`
* `_cli.js`: parses the command line arguments passed to `compare.js`,
  `run.js` and `scatter.js`
* `_cli.R`: parses the command line arguments passed to `compare.R`
* `_http-benchmarkers.js`: selects and runs external tools for benchmarking
  the `http` subsystem.
* `common.js`: see [Common API](#common-api).
* `compare.js`: command line tool for comparing performance between different
  Node.js binaries.
* `compare.R`: R script for statistically analyzing the output of
  `compare.js`
* `run.js`: command line tool for running individual benchmark suite(s).
* `scatter.js`: command line tool for comparing the performance
  between different parameters in benchmark configurations,
  for example to analyze the time complexity.
* `scatter.R`: R script for visualizing the output of `scatter.js` with
  scatter plots.

## Common API

The common.js module is used by benchmarks for consistency across repeated
tasks. It has a number of helpful functions and properties to help with
writing benchmarks.

### `createBenchmark(fn, configs[, options])`

See [the guide on writing benchmarks](../doc/contributing/writing-and-running-benchmarks.md#basics-of-a-benchmark).

### `default_http_benchmarker`

The default benchmarker used to run HTTP benchmarks.
See [the guide on writing HTTP benchmarks](../doc/contributing/writing-and-running-benchmarks.md#creating-an-http-benchmark).

### `PORT`

The default port used to run HTTP benchmarks.
See [the guide on writing HTTP benchmarks](../doc/contributing/writing-and-running-benchmarks.md#creating-an-http-benchmark).

### `sendResult(data)`

Used in special benchmarks that can't use `createBenchmark` and the object
it returns to accomplish what they need. This function reports timing
data to the parent process (usually created by running `compare.js`, `run.js` or
`scatter.js`).
