extra-benchmark 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/benchmark.js +3 -2
- package/lib/benchmark.js.map +1 -1
- package/package.json +3 -5
- package/src/benchmark.ts +177 -0
- package/src/index.ts +1 -0
package/lib/benchmark.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Benchmark = void 0;
|
|
4
4
|
const prelude_1 = require("@blackglory/prelude");
|
|
5
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
5
6
|
class Benchmark {
|
|
6
7
|
constructor(name, options = {}) {
|
|
7
8
|
this.name = name;
|
|
@@ -77,9 +78,9 @@ async function sample({ iterate, beforeEach, times }) {
|
|
|
77
78
|
for (let i = times; i--;) {
|
|
78
79
|
await beforeEach();
|
|
79
80
|
const startRSS = process.memoryUsage().rss;
|
|
80
|
-
const startTime = performance.now();
|
|
81
|
+
const startTime = perf_hooks_1.performance.now();
|
|
81
82
|
const afterEach = await iterate();
|
|
82
|
-
const endTime = performance.now();
|
|
83
|
+
const endTime = perf_hooks_1.performance.now();
|
|
83
84
|
const endRSS = process.memoryUsage().rss;
|
|
84
85
|
if ((0, prelude_1.isFunction)(afterEach)) {
|
|
85
86
|
await afterEach();
|
package/lib/benchmark.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-benchmark",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Lightweight benchmarking library.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"files": [
|
|
7
7
|
"lib",
|
|
8
|
-
"
|
|
8
|
+
"src"
|
|
9
9
|
],
|
|
10
10
|
"main": "lib/index.js",
|
|
11
11
|
"types": "lib/index.d.ts",
|
|
@@ -20,10 +20,9 @@
|
|
|
20
20
|
"test:coverage": "jest --coverage --config jest.config.js",
|
|
21
21
|
"prepublishOnly": "run-s clean build",
|
|
22
22
|
"clean": "rimraf lib",
|
|
23
|
-
"build": "run-
|
|
23
|
+
"build": "run-s build:*",
|
|
24
24
|
"build:compile": "tsc --project tsconfig.build.json --module commonjs",
|
|
25
25
|
"build:patch": "tscpaths -p tsconfig.build.json -s ./src -o ./lib",
|
|
26
|
-
"bench": "./benches/benchmark.sh",
|
|
27
26
|
"release": "standard-version"
|
|
28
27
|
},
|
|
29
28
|
"husky": {
|
|
@@ -33,7 +32,6 @@
|
|
|
33
32
|
}
|
|
34
33
|
},
|
|
35
34
|
"devDependencies": {
|
|
36
|
-
"@blackglory/jest-matchers": "^0.5.0",
|
|
37
35
|
"@commitlint/cli": "^17.3.0",
|
|
38
36
|
"@commitlint/config-conventional": "^17.3.0",
|
|
39
37
|
"@types/jest": "^29.2.3",
|
package/src/benchmark.ts
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { pass, Awaitable, isFunction } from '@blackglory/prelude'
|
|
2
|
+
import { performance } from 'perf_hooks'
|
|
3
|
+
|
|
4
|
+
export interface IBenchmarkOptions {
|
|
5
|
+
/* The number of times to warm up the benchmark test */
|
|
6
|
+
warms?: number
|
|
7
|
+
|
|
8
|
+
/* The number of times to run the benchmark test */
|
|
9
|
+
runs?: number
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface IBenchmarkCaseResult {
|
|
13
|
+
name: string
|
|
14
|
+
warms: number
|
|
15
|
+
runs: number
|
|
16
|
+
|
|
17
|
+
operationsPerSecond: number
|
|
18
|
+
operationsPerMillisecond: number
|
|
19
|
+
|
|
20
|
+
/* Milliseconds */
|
|
21
|
+
maxiumElapsedTime: number
|
|
22
|
+
minimumElapsedTime: number
|
|
23
|
+
averageElapsedTime: number
|
|
24
|
+
|
|
25
|
+
/* Bytes */
|
|
26
|
+
maximumMemoryIncrements: number
|
|
27
|
+
minimumMemoryIncrements: number
|
|
28
|
+
averageMemoryIncrements: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface IBenchmarkCase {
|
|
32
|
+
name: string
|
|
33
|
+
fn: () => Awaitable<
|
|
34
|
+
| (() => Awaitable<void | (() => void)>) // iterate
|
|
35
|
+
| {
|
|
36
|
+
iterate: () => Awaitable<void | (() => void)>
|
|
37
|
+
beforeEach?: () => Awaitable<void>
|
|
38
|
+
afterAll?: () => Awaitable<void>
|
|
39
|
+
}
|
|
40
|
+
>
|
|
41
|
+
options: IBenchmarkOptions
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface ISample {
|
|
45
|
+
// Milliseconds
|
|
46
|
+
elapsedTime: number
|
|
47
|
+
memoryIncrements: number
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class Benchmark {
|
|
51
|
+
private benchmarkCases: IBenchmarkCase[] = []
|
|
52
|
+
private warms: number
|
|
53
|
+
private runs: number
|
|
54
|
+
|
|
55
|
+
constructor(public readonly name: string, options: IBenchmarkOptions = {}) {
|
|
56
|
+
this.warms = options.warms ?? 100
|
|
57
|
+
this.runs = options.runs ?? 100
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
addCase(
|
|
61
|
+
name: string
|
|
62
|
+
, fn: () => Awaitable<
|
|
63
|
+
// iterate(): afterEach
|
|
64
|
+
| (() => Awaitable<void | (() => Awaitable<void>)>)
|
|
65
|
+
| {
|
|
66
|
+
// iterate(): afterEach
|
|
67
|
+
iterate: () => Awaitable<void | (() => void)>
|
|
68
|
+
beforeEach?: () => Awaitable<void>
|
|
69
|
+
afterAll?: () => Awaitable<void>
|
|
70
|
+
}
|
|
71
|
+
>
|
|
72
|
+
, options: IBenchmarkOptions = {}
|
|
73
|
+
): void {
|
|
74
|
+
this.benchmarkCases.push({ name, fn, options })
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async * run(): AsyncIterable<IBenchmarkCaseResult> {
|
|
78
|
+
for (const benchmarkCase of this.benchmarkCases) {
|
|
79
|
+
const { fn, name, options } = benchmarkCase
|
|
80
|
+
const result = await fn()
|
|
81
|
+
const iterate = isFunction(result) ? result : result.iterate
|
|
82
|
+
const beforeEach = isFunction(result) ? pass : (result.beforeEach ?? pass)
|
|
83
|
+
const afterAll = isFunction(result) ? pass : (result.afterAll ?? pass)
|
|
84
|
+
const warms = options.warms ?? this.warms
|
|
85
|
+
const runs = options.runs ?? this.runs
|
|
86
|
+
|
|
87
|
+
// warm-up
|
|
88
|
+
await sample({
|
|
89
|
+
iterate
|
|
90
|
+
, beforeEach
|
|
91
|
+
, times: warms
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
// run
|
|
95
|
+
const samples: ISample[] = await sample({
|
|
96
|
+
iterate
|
|
97
|
+
, beforeEach
|
|
98
|
+
, times: runs
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
await afterAll()
|
|
102
|
+
|
|
103
|
+
const elapsedTimes = samples.map(x => x.elapsedTime)
|
|
104
|
+
const maxiumElapsedTime = elapsedTimes.reduce((max, cur) => {
|
|
105
|
+
return cur > max ? cur : max
|
|
106
|
+
})
|
|
107
|
+
const minimumElapsedTime = elapsedTimes.reduce((min, cur) => {
|
|
108
|
+
return cur > min ? min : cur
|
|
109
|
+
})
|
|
110
|
+
const totalElapsedTime = elapsedTimes.reduce((acc, cur) => {
|
|
111
|
+
return acc + cur
|
|
112
|
+
})
|
|
113
|
+
const averageElapsedTime = totalElapsedTime / runs
|
|
114
|
+
|
|
115
|
+
const operationsPerMillisecond = runs / totalElapsedTime
|
|
116
|
+
const operationsPerSecond = runs / (totalElapsedTime / 1000)
|
|
117
|
+
|
|
118
|
+
const memoryIncrments = samples.map(x => x.memoryIncrements)
|
|
119
|
+
const maximumMemoryIncrements = memoryIncrments.reduce((max, cur) => {
|
|
120
|
+
return cur > max ? cur : max
|
|
121
|
+
})
|
|
122
|
+
const minimumMemoryIncrements = memoryIncrments.reduce((min, cur) => {
|
|
123
|
+
return cur > min ? min : cur
|
|
124
|
+
})
|
|
125
|
+
const averageMemoryIncrements = memoryIncrments.reduce((average, cur) => {
|
|
126
|
+
return (average + cur) / 2
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
yield {
|
|
130
|
+
name
|
|
131
|
+
, warms
|
|
132
|
+
, runs
|
|
133
|
+
, operationsPerSecond
|
|
134
|
+
, operationsPerMillisecond
|
|
135
|
+
, maxiumElapsedTime
|
|
136
|
+
, minimumElapsedTime
|
|
137
|
+
, averageElapsedTime
|
|
138
|
+
, maximumMemoryIncrements
|
|
139
|
+
, averageMemoryIncrements
|
|
140
|
+
, minimumMemoryIncrements
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function sample({ iterate, beforeEach, times }: {
|
|
147
|
+
// iterate(): afterEach
|
|
148
|
+
iterate: () => Awaitable<void | (() => Awaitable<void>)>
|
|
149
|
+
, beforeEach: () => Awaitable<void>
|
|
150
|
+
, times: number
|
|
151
|
+
}
|
|
152
|
+
): Promise<ISample[]> {
|
|
153
|
+
const samples: ISample[] = []
|
|
154
|
+
|
|
155
|
+
for (let i = times; i--;) {
|
|
156
|
+
await beforeEach()
|
|
157
|
+
|
|
158
|
+
const startRSS = process.memoryUsage().rss
|
|
159
|
+
const startTime = performance.now()
|
|
160
|
+
|
|
161
|
+
const afterEach = await iterate()
|
|
162
|
+
|
|
163
|
+
const endTime = performance.now()
|
|
164
|
+
const endRSS = process.memoryUsage().rss
|
|
165
|
+
|
|
166
|
+
if (isFunction(afterEach)) {
|
|
167
|
+
await afterEach()
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const elapsedTime = endTime - startTime
|
|
171
|
+
const memoryIncrements = endRSS - startRSS
|
|
172
|
+
|
|
173
|
+
samples.push({ elapsedTime, memoryIncrements })
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return samples
|
|
177
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './benchmark'
|