extra-benchmark 0.1.1 → 0.2.1
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/README.md +13 -5
- package/lib/benchmark.d.ts +11 -8
- package/lib/benchmark.js +39 -33
- package/lib/benchmark.js.map +1 -1
- package/package.json +15 -15
package/README.md
CHANGED
|
@@ -46,7 +46,7 @@ for await (const result of benchmark.run()) {
|
|
|
46
46
|
```ts
|
|
47
47
|
interface IBenchmarkOptions {
|
|
48
48
|
/* The number of times to warm up the benchmark test */
|
|
49
|
-
|
|
49
|
+
warms?: number
|
|
50
50
|
|
|
51
51
|
/* The number of times to run the benchmark test */
|
|
52
52
|
runs?: number
|
|
@@ -54,12 +54,11 @@ interface IBenchmarkOptions {
|
|
|
54
54
|
|
|
55
55
|
interface IBenchmarkCaseResult {
|
|
56
56
|
name: string
|
|
57
|
-
|
|
57
|
+
warms: number
|
|
58
58
|
runs: number
|
|
59
59
|
|
|
60
60
|
operationsPerSecond: number
|
|
61
61
|
operationsPerMillisecond: number
|
|
62
|
-
operationsPerNanosecond: number
|
|
63
62
|
|
|
64
63
|
/* Milliseconds */
|
|
65
64
|
maxiumElapsedTime: bigint
|
|
@@ -81,14 +80,23 @@ class Benchmark {
|
|
|
81
80
|
constructor(
|
|
82
81
|
name: string
|
|
83
82
|
, {
|
|
84
|
-
|
|
83
|
+
warms: 100
|
|
85
84
|
, runs: 100
|
|
86
85
|
}: IBenchmarkOptions = {}
|
|
87
86
|
)
|
|
88
87
|
|
|
89
88
|
addCase(
|
|
90
89
|
name: string
|
|
91
|
-
, fn: () => Awaitable<
|
|
90
|
+
, fn: () => Awaitable<
|
|
91
|
+
// iterate(): afterEach
|
|
92
|
+
| (() => Awaitable<(() => Awaitable<void>) | Falsy>)
|
|
93
|
+
| {
|
|
94
|
+
// iterate(): afterEach
|
|
95
|
+
iterate: () => Awaitable<(() => Awaitable<void>) | Falsy>
|
|
96
|
+
beforeEach?: () => Awaitable<void>
|
|
97
|
+
afterAll?: () => Awaitable<void>
|
|
98
|
+
}
|
|
99
|
+
>
|
|
92
100
|
, options?: IBenchmarkResult
|
|
93
101
|
): void
|
|
94
102
|
|
package/lib/benchmark.d.ts
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { Awaitable } from '@blackglory/prelude';
|
|
2
2
|
export interface IBenchmarkOptions {
|
|
3
|
-
|
|
3
|
+
warms?: number;
|
|
4
4
|
runs?: number;
|
|
5
5
|
}
|
|
6
6
|
export interface IBenchmarkCaseResult {
|
|
7
7
|
name: string;
|
|
8
|
-
|
|
8
|
+
warms: number;
|
|
9
9
|
runs: number;
|
|
10
10
|
operationsPerSecond: number;
|
|
11
11
|
operationsPerMillisecond: number;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
averageElapsedTime: bigint;
|
|
12
|
+
maxiumElapsedTime: number;
|
|
13
|
+
minimumElapsedTime: number;
|
|
14
|
+
averageElapsedTime: number;
|
|
16
15
|
maximumMemoryIncrements: number;
|
|
17
16
|
minimumMemoryIncrements: number;
|
|
18
17
|
averageMemoryIncrements: number;
|
|
@@ -20,9 +19,13 @@ export interface IBenchmarkCaseResult {
|
|
|
20
19
|
export declare class Benchmark {
|
|
21
20
|
readonly name: string;
|
|
22
21
|
private benchmarkCases;
|
|
23
|
-
private
|
|
22
|
+
private warms;
|
|
24
23
|
private runs;
|
|
25
24
|
constructor(name: string, options?: IBenchmarkOptions);
|
|
26
|
-
addCase(name: string, fn: () => Awaitable<() => Awaitable<void
|
|
25
|
+
addCase(name: string, fn: () => Awaitable<(() => Awaitable<void | (() => Awaitable<void>)>) | {
|
|
26
|
+
iterate: () => Awaitable<void | (() => void)>;
|
|
27
|
+
beforeEach?: () => Awaitable<void>;
|
|
28
|
+
afterAll?: () => Awaitable<void>;
|
|
29
|
+
}>, options?: IBenchmarkOptions): void;
|
|
27
30
|
run(): AsyncIterable<IBenchmarkCaseResult>;
|
|
28
31
|
}
|
package/lib/benchmark.js
CHANGED
|
@@ -6,7 +6,7 @@ class Benchmark {
|
|
|
6
6
|
constructor(name, options = {}) {
|
|
7
7
|
this.name = name;
|
|
8
8
|
this.benchmarkCases = [];
|
|
9
|
-
this.
|
|
9
|
+
this.warms = options.warms ?? 100;
|
|
10
10
|
this.runs = options.runs ?? 100;
|
|
11
11
|
}
|
|
12
12
|
addCase(name, fn, options = {}) {
|
|
@@ -15,30 +15,36 @@ class Benchmark {
|
|
|
15
15
|
async *run() {
|
|
16
16
|
for (const benchmarkCase of this.benchmarkCases) {
|
|
17
17
|
const { fn, name, options } = benchmarkCase;
|
|
18
|
-
const
|
|
19
|
-
const
|
|
18
|
+
const result = await fn();
|
|
19
|
+
const iterate = (0, prelude_1.isFunction)(result) ? result : result.iterate;
|
|
20
|
+
const beforeEach = (0, prelude_1.isFunction)(result) ? prelude_1.pass : (result.beforeEach ?? prelude_1.pass);
|
|
21
|
+
const afterAll = (0, prelude_1.isFunction)(result) ? prelude_1.pass : (result.afterAll ?? prelude_1.pass);
|
|
22
|
+
const warms = options.warms ?? this.warms;
|
|
20
23
|
const runs = options.runs ?? this.runs;
|
|
21
|
-
await sample(
|
|
22
|
-
|
|
24
|
+
await sample({
|
|
25
|
+
iterate,
|
|
26
|
+
beforeEach,
|
|
27
|
+
times: warms
|
|
28
|
+
});
|
|
29
|
+
const samples = await sample({
|
|
30
|
+
iterate,
|
|
31
|
+
beforeEach,
|
|
32
|
+
times: runs
|
|
33
|
+
});
|
|
34
|
+
await afterAll();
|
|
23
35
|
const elapsedTimes = samples.map(x => x.elapsedTime);
|
|
24
|
-
const maxiumElapsedTime = elapsedTimes.reduce((max, cur) =>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
if (totalElapsedTime <= Number.MAX_SAFE_INTEGER) {
|
|
30
|
-
const operationsPerNanosecond = runs / Number(totalElapsedTime);
|
|
31
|
-
const operationsPerMillisecond = runs / (Number(totalElapsedTime) / 1000000);
|
|
32
|
-
const operationsPerSecond = runs / (Number(totalElapsedTime) / 1000000 / 1000);
|
|
33
|
-
return { operationsPerSecond, operationsPerMillisecond, operationsPerNanosecond };
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
const operationsPerNanosecond = Number(BigInt(runs) / totalElapsedTime);
|
|
37
|
-
const operationsPerMillisecond = runs / Number(totalElapsedTime / 1000000n);
|
|
38
|
-
const operationsPerSecond = runs / (Number(totalElapsedTime / 1000000n) / 1000);
|
|
39
|
-
return { operationsPerSecond, operationsPerMillisecond, operationsPerNanosecond };
|
|
40
|
-
}
|
|
36
|
+
const maxiumElapsedTime = elapsedTimes.reduce((max, cur) => {
|
|
37
|
+
return cur > max ? cur : max;
|
|
38
|
+
});
|
|
39
|
+
const minimumElapsedTime = elapsedTimes.reduce((min, cur) => {
|
|
40
|
+
return cur > min ? min : cur;
|
|
41
41
|
});
|
|
42
|
+
const totalElapsedTime = elapsedTimes.reduce((acc, cur) => {
|
|
43
|
+
return acc + cur;
|
|
44
|
+
});
|
|
45
|
+
const averageElapsedTime = totalElapsedTime / runs;
|
|
46
|
+
const operationsPerMillisecond = runs / totalElapsedTime;
|
|
47
|
+
const operationsPerSecond = runs / (totalElapsedTime / 1000);
|
|
42
48
|
const memoryIncrments = samples.map(x => x.memoryIncrements);
|
|
43
49
|
const maximumMemoryIncrements = memoryIncrments.reduce((max, cur) => {
|
|
44
50
|
return cur > max ? cur : max;
|
|
@@ -51,11 +57,10 @@ class Benchmark {
|
|
|
51
57
|
});
|
|
52
58
|
yield {
|
|
53
59
|
name,
|
|
54
|
-
|
|
60
|
+
warms,
|
|
55
61
|
runs,
|
|
56
62
|
operationsPerSecond,
|
|
57
63
|
operationsPerMillisecond,
|
|
58
|
-
operationsPerNanosecond,
|
|
59
64
|
maxiumElapsedTime,
|
|
60
65
|
minimumElapsedTime,
|
|
61
66
|
averageElapsedTime,
|
|
@@ -67,20 +72,21 @@ class Benchmark {
|
|
|
67
72
|
}
|
|
68
73
|
}
|
|
69
74
|
exports.Benchmark = Benchmark;
|
|
70
|
-
async function sample(iterate, times) {
|
|
75
|
+
async function sample({ iterate, beforeEach, times }) {
|
|
71
76
|
const samples = [];
|
|
72
77
|
for (let i = times; i--;) {
|
|
78
|
+
await beforeEach();
|
|
73
79
|
const startRSS = process.memoryUsage().rss;
|
|
74
|
-
const startTime =
|
|
75
|
-
await iterate();
|
|
76
|
-
const endTime =
|
|
77
|
-
const elapsedTime = endTime - startTime;
|
|
80
|
+
const startTime = performance.now();
|
|
81
|
+
const afterEach = await iterate();
|
|
82
|
+
const endTime = performance.now();
|
|
78
83
|
const endRSS = process.memoryUsage().rss;
|
|
84
|
+
if ((0, prelude_1.isFunction)(afterEach)) {
|
|
85
|
+
await afterEach();
|
|
86
|
+
}
|
|
87
|
+
const elapsedTime = endTime - startTime;
|
|
79
88
|
const memoryIncrements = endRSS - startRSS;
|
|
80
|
-
samples.push({
|
|
81
|
-
elapsedTime,
|
|
82
|
-
memoryIncrements
|
|
83
|
-
});
|
|
89
|
+
samples.push({ elapsedTime, memoryIncrements });
|
|
84
90
|
}
|
|
85
91
|
return samples;
|
|
86
92
|
}
|
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":";;;AAAA,iDAAmE;AAgDnE,MAAa,SAAS;IAKpB,YAA4B,IAAY,EAAE,UAA6B,EAAE;QAA7C,SAAI,GAAJ,IAAI,CAAQ;QAJhC,mBAAc,GAAqB,EAAE,CAAA;QAK3C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAA;QACjC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAA;IACjC,CAAC;IAED,OAAO,CACL,IAAY,EACZ,EASC,EACD,UAA6B,EAAE;QAE/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,CAAE,GAAG;QACT,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE;YAC/C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAA;YAC3C,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAA;YACzB,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAA;YAC5D,MAAM,UAAU,GAAG,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,cAAI,CAAC,CAAA;YAC1E,MAAM,QAAQ,GAAG,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,cAAI,CAAC,CAAA;YACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAA;YACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAA;YAGtC,MAAM,MAAM,CAAC;gBACX,OAAO;gBACP,UAAU;gBACV,KAAK,EAAE,KAAK;aACb,CAAC,CAAA;YAGF,MAAM,OAAO,GAAc,MAAM,MAAM,CAAC;gBACtC,OAAO;gBACP,UAAU;gBACV,KAAK,EAAE,IAAI;aACZ,CAAC,CAAA;YAEF,MAAM,QAAQ,EAAE,CAAA;YAEhB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;YACpD,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACzD,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;YAC9B,CAAC,CAAC,CAAA;YACF,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC1D,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;YAC9B,CAAC,CAAC,CAAA;YACF,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACxD,OAAO,GAAG,GAAG,GAAG,CAAA;YAClB,CAAC,CAAC,CAAA;YACF,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,IAAI,CAAA;YAElD,MAAM,wBAAwB,GAAG,IAAI,GAAG,gBAAgB,CAAA;YACxD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;YAE5D,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;YAC5D,MAAM,uBAAuB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAClE,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;YAC9B,CAAC,CAAC,CAAA;YACF,MAAM,uBAAuB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAClE,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;YAC9B,CAAC,CAAC,CAAA;YACF,MAAM,uBAAuB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;gBACtE,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YAC5B,CAAC,CAAC,CAAA;YAEF,MAAM;gBACJ,IAAI;gBACJ,KAAK;gBACL,IAAI;gBACJ,mBAAmB;gBACnB,wBAAwB;gBACxB,iBAAiB;gBACjB,kBAAkB;gBAClB,kBAAkB;gBAClB,uBAAuB;gBACvB,uBAAuB;gBACvB,uBAAuB;aACxB,CAAA;SACF;IACH,CAAC;CACF;AA9FD,8BA8FC;AAED,KAAK,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAKjD;IAEC,MAAM,OAAO,GAAc,EAAE,CAAA;IAE7B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG;QACxB,MAAM,UAAU,EAAE,CAAA;QAElB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,CAAA;QAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QAEnC,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAA;QAEjC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,CAAA;QAExC,IAAI,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE;YACzB,MAAM,SAAS,EAAE,CAAA;SAClB;QAED,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;QACvC,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAA;QAE1C,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAA;KAChD;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-benchmark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Lightweight benchmarking library.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"files": [
|
|
@@ -33,27 +33,27 @@
|
|
|
33
33
|
}
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@blackglory/jest-matchers": "^0.
|
|
37
|
-
"@commitlint/cli": "^17.0
|
|
38
|
-
"@commitlint/config-conventional": "^17.0
|
|
39
|
-
"@types/jest": "^
|
|
40
|
-
"@types/node": "
|
|
41
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
42
|
-
"@typescript-eslint/parser": "^5.
|
|
43
|
-
"eslint": "^8.
|
|
36
|
+
"@blackglory/jest-matchers": "^0.5.0",
|
|
37
|
+
"@commitlint/cli": "^17.3.0",
|
|
38
|
+
"@commitlint/config-conventional": "^17.3.0",
|
|
39
|
+
"@types/jest": "^29.2.3",
|
|
40
|
+
"@types/node": "16",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^5.44.0",
|
|
42
|
+
"@typescript-eslint/parser": "^5.44.0",
|
|
43
|
+
"eslint": "^8.28.0",
|
|
44
44
|
"husky": "^4.3.8",
|
|
45
|
-
"iterable-operator": "^
|
|
46
|
-
"jest": "^
|
|
45
|
+
"iterable-operator": "^2.5.0",
|
|
46
|
+
"jest": "^29.3.1",
|
|
47
47
|
"npm-run-all": "^4.1.5",
|
|
48
48
|
"return-style": "^1.0.0",
|
|
49
49
|
"rimraf": "^3.0.2",
|
|
50
50
|
"standard-version": "^9.5.0",
|
|
51
|
-
"ts-jest": "^
|
|
51
|
+
"ts-jest": "^29.0.3",
|
|
52
52
|
"tscpaths": "^0.0.9",
|
|
53
|
-
"tslib": "^2.
|
|
54
|
-
"typescript": "^4.
|
|
53
|
+
"tslib": "^2.4.1",
|
|
54
|
+
"typescript": "^4.9.3"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@blackglory/prelude": "^0.1.
|
|
57
|
+
"@blackglory/prelude": "^0.1.8"
|
|
58
58
|
}
|
|
59
59
|
}
|