https://github.com/planttheidea/benchee
Simple benchmarks in both node and browser
https://github.com/planttheidea/benchee
benchmark javascript
Last synced: 8 months ago
JSON representation
Simple benchmarks in both node and browser
- Host: GitHub
- URL: https://github.com/planttheidea/benchee
- Owner: planttheidea
- License: mit
- Created: 2018-10-19T14:08:40.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2024-03-28T17:36:43.000Z (over 2 years ago)
- Last Synced: 2025-04-13T10:12:48.485Z (about 1 year ago)
- Topics: benchmark, javascript
- Language: TypeScript
- Size: 1.15 MB
- Stars: 27
- Watchers: 3
- Forks: 2
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# benchee
Simple benchmarks in both node and browser
## Table of contents
- [Requirements](#requirements)
- [Usage](#usage)
- [Benchmark groups](#benchmark-groups)
- [Statistics](#statistics)
- [Options](#options)
- [delay](#delay)
- [minIterations](#miniterations)
- [minTime](#mintime)
- [onComplete](#oncomplete)
- [onGroupComplete](#ongroupcomplete)
- [onGroupStart](#ongroupstart)
- [onResult](#onresult)
- [type](#type)
- [Support](#support)
- [Browser](#browser)
- [Node](#node)
- [Development](#development)
## Requirements
`benchee` requires that `Promise` is available globally. If using an environment that does not support it, you should polyfill prior to importing `benchee`.
## Usage
```javascript
import { benchmark, createSuite } from "benchee";
// the functions to benchmark
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
// create an individual benchmark
benchmark("add", () => add(1, 2)).then(results => console.log(results));
/*
{
"stats": {
"elapsed": 677,
"endTime": 1540050973491,
"startTime": 1540050972814,
"iterations": 82165907,
"ops": 121367661,
"tpe": 0.00000823942708987561
},
"name": "add"
}
*/
// or create a suite of benchmarks
createSuite()
.add("add", () => add(1, 2))
.add("subtract", () => subtract(1, 2))
.run()
.then(results => console.log(results));
/*
{
"ungrouped": [
{
"stats": {
"elapsed": 802,
"endTime": 1540050973617,
"startTime": 1540050972815,
"iterations": 28777534,
"ops": 35882211,
"tpe": 0.000027868961947886152
},
"name": "add"
},
{
"stats": {
"elapsed": 750,
"endTime": 1540050974473,
"startTime": 1540050973723,
"iterations": 106326932,
"ops": 141769242,
"tpe": 0.000007053716174186235
},
"name": "subtract"
}
]
}
*/
```
The results contract is `Promise`-based, however you can also access the results in a [callback format](#oncomplete) if preferred.
## Benchmark groups
In addition to running standard benchmarks, you can group benchmarks together within the same suite. The results of each group can be accessed through the [`onGroupComplete` callback](#ongroupcomplete), and will namespaced under the group name in the final results.
To apply a group, simply add a group name as the second parameter to your test.
```javascript
createSuite()
.add("add", "math", () => add(1, 2))
.add("trim", "string", () => " trimmed ".trim())
.run()
.then(results => console.log(results));
/*
{
"math": [
{
"stats": {
"elapsed": 888,
"endTime": 1540051045206,
"startTime": 1540051044318,
"iterations": 38415463,
"ops": 43260656,
"tpe": 0.000023115691720284616
},
"name": "add"
}
],
"string": [
{
"stats": {
"elapsed": 568,
"endTime": 1540051045880,
"startTime": 1540051045312,
"iterations": 15363261,
"ops": 27047994,
"tpe": 0.00003697131748266205
},
"name": "trim"
}
]
}
*/
```
## Statistics
Statistics for each benchmark have the following shape:
```javascript
{
// time of total benchmark run
elapsed: number;
// timestamp of benchmark complete
endTime: number;
// number of operations executed in benchmark
iterations: number;
// operations per second calculation
ops: number;
// time per execution calculation
tpe: number;
// timestamp of benchmark start
startTime: number;
}
```
## Options
#### delay
The time wait between execution of benchmark [groups](#benchmark-groups) _(defaults to 100ms)_
#### minIterations
The minimum number of iterations that need to occur before the benchmark is considered complete _(defaults to 10)_
#### minTime
The minimum amount of time that needs to elapse before the benchmark is considered complete _(defaults to 500ms)_
**NOTE**: This is ignored when [`type`](#type) is set to `fixed`.
#### onComplete
Function called when suite has finished running. This is the callback method to receive results, if preferred over the standard promised-based method.
```javascript
onComplete: (results: Benchee.Results) => void;
```
#### onGroupComplete
Function called when a given [group](#benchmark-groups) has completed all of its benchmarks.
```javascript
onGroupComplete: (results: Benchee.ResultsGroup) => void;
```
#### onGroupStart
Function called when a given [group](#benchmark-groups) has started running its benchmarks.
```javascript
onGroupStart: (group: string) => void;
```
#### onResult
Function called when a specific benchmark has finished running.
```javascript
onResult: (result: Benchee.Result) => void;
```
#### type
The type of benchmark to perform. _(defaults to `adaptive`)_
Valid values:
- `adaptive` => number of iterations performed is based on an exponential algorithm driven by the `minTime`
- `fixed` => number of iterations performed is based directly on `minIterations`
## Support
#### Browser
- Chrome (33+)
- Edge (all)
- Firefox (29+)
- Opera (20+)
- Safari (7.1+)
**NOTE**: If a `Promise` polyfill is provided, then older versions / unlisted browsers should be supported as well (notably IE11).
#### Node
- 6+
## Development
Standard stuff, clone the repo and `npm install` dependencies. The npm scripts available:
- `build` => run rollup to build the distributed files in `dist`
- `clean` => run `rimraf` on the `dist` folder
- `dev` => run webpack dev server to run example app (playground!)
- `dist` => runs `clean`, `build`, and `build:types`
- `lint` => runs TSLint against all files in the `src` folder
- `lint:fix` => runs `lint`, fixing any errors if possible
- `prepublish` => runs `prepublish:compile`
- `prepublish:compile` => run `lint`, `test:coverage`, and `dist`
- `test` => run Jest, testing functions with `NODE_ENV=test`
- `test:coverage` => run `test` but with code coverage output
- `test:watch` => run `test`, but with persistent watcher