@riim/bench 0.1.0 → 0.2.0
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 +1 -0
- package/dist/Bench.d.ts +12 -11
- package/dist/bench.js +55 -13
- package/dist/index.d.ts +1 -1
- package/package.json +9 -9
- package/benchmarks/loops.bench.ts +0 -75
package/README.md
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @riim/bench
|
package/dist/Bench.d.ts
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
export interface ITaskFnParams {
|
|
2
|
+
iteration: number;
|
|
2
3
|
timeStart: () => void;
|
|
3
4
|
timeEnd: () => void;
|
|
4
5
|
}
|
|
5
|
-
export type TTaskFn = (params: ITaskFnParams) =>
|
|
6
|
-
export interface ITask {
|
|
6
|
+
export type TTaskFn<T> = (params: ITaskFnParams) => T | Promise<T>;
|
|
7
|
+
export interface ITask<T> {
|
|
7
8
|
name: string;
|
|
8
|
-
fn: TTaskFn
|
|
9
|
+
fn: TTaskFn<T>;
|
|
9
10
|
completionTimeMeasurements: Array<number>;
|
|
10
11
|
memoryUsageMeasurements: Array<number>;
|
|
11
12
|
}
|
|
12
|
-
export type TReturnedValue = [taskName: string, returnedValue:
|
|
13
|
-
export type TCheckReturnedValues = (
|
|
14
|
-
export declare class Bench {
|
|
13
|
+
export type TReturnedValue<T> = [taskName: string, returnedValue: T];
|
|
14
|
+
export type TCheckReturnedValues<T> = (values: Array<TReturnedValue<T>>, iteration: number) => void;
|
|
15
|
+
export declare class Bench<T = any> {
|
|
15
16
|
readonly name: string | undefined;
|
|
16
17
|
readonly warmupTime: number;
|
|
17
18
|
readonly warmupIterations: number;
|
|
18
19
|
readonly time: number;
|
|
19
20
|
readonly iterations: number;
|
|
20
21
|
readonly memoryUsage: boolean;
|
|
21
|
-
readonly checkReturnedValues: TCheckReturnedValues | null;
|
|
22
|
-
protected _tasks: Map<string, ITask
|
|
22
|
+
readonly checkReturnedValues: TCheckReturnedValues<T> | null;
|
|
23
|
+
protected _tasks: Map<string, ITask<T>>;
|
|
23
24
|
onIterationStart: import("@riim/event").IUnparametrizedEvent<any>;
|
|
24
25
|
onIterationEnd: import("@riim/event").IUnparametrizedEvent<any>;
|
|
25
26
|
constructor({ name, warmupTime, warmupIterations, time, iterations, memoryUsage, checkReturnedValues }?: {
|
|
@@ -29,9 +30,9 @@ export declare class Bench {
|
|
|
29
30
|
time?: number;
|
|
30
31
|
iterations?: number;
|
|
31
32
|
memoryUsage?: boolean;
|
|
32
|
-
checkReturnedValues?: TCheckReturnedValues
|
|
33
|
+
checkReturnedValues?: TCheckReturnedValues<T>;
|
|
33
34
|
});
|
|
34
|
-
add(name: string, fn: TTaskFn): this;
|
|
35
|
+
add(name: string, fn: TTaskFn<T>): this;
|
|
35
36
|
remove(name: string): this;
|
|
36
37
|
run(options?: {
|
|
37
38
|
warmupTime?: number;
|
|
@@ -39,7 +40,7 @@ export declare class Bench {
|
|
|
39
40
|
time?: number;
|
|
40
41
|
iterations?: number;
|
|
41
42
|
memoryUsage?: boolean;
|
|
42
|
-
checkReturnedValues?: TCheckReturnedValues
|
|
43
|
+
checkReturnedValues?: TCheckReturnedValues<T>;
|
|
43
44
|
}): Promise<void>;
|
|
44
45
|
protected _formatMeasurements({ verbose, memoryUsage }?: {
|
|
45
46
|
verbose?: boolean;
|
package/dist/bench.js
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, {
|
|
2
|
+
value: 'Module'
|
|
3
|
+
});
|
|
4
|
+
//#region \0rolldown/runtime.js
|
|
5
|
+
var __create = Object.create;
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
8
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
9
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
10
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
14
|
+
key = keys[i];
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
16
|
+
__defProp(to, key, {
|
|
17
|
+
get: (k => from[k]).bind(null, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return to;
|
|
24
|
+
};
|
|
25
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
26
|
+
value: mod,
|
|
27
|
+
enumerable: true
|
|
28
|
+
}) : target, mod));
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
var _riim_event = require("@riim/event");
|
|
32
|
+
var jstat = require("jstat");
|
|
33
|
+
jstat = __toESM(jstat);
|
|
3
34
|
|
|
4
35
|
//#region src/utils.ts
|
|
5
36
|
var noop = () => {};
|
|
@@ -22,7 +53,7 @@ function percentile(sortedMeasurements, pct) {
|
|
|
22
53
|
}
|
|
23
54
|
function rme(measurements, meanValue) {
|
|
24
55
|
var n = measurements.length;
|
|
25
|
-
var tValue = jstat.studentt.inv(.975, n - 1);
|
|
56
|
+
var tValue = jstat.default.studentt.inv(.975, n - 1);
|
|
26
57
|
var variance = measurements.map(val => Math.pow(val - meanValue, 2)).reduce((sum, val) => sum + val, 0) / (n - 1);
|
|
27
58
|
return tValue * (Math.sqrt(variance) / Math.sqrt(n)) / meanValue * 100;
|
|
28
59
|
}
|
|
@@ -30,6 +61,16 @@ function rme(measurements, meanValue) {
|
|
|
30
61
|
//#endregion
|
|
31
62
|
//#region src/Bench.ts
|
|
32
63
|
var Bench = class {
|
|
64
|
+
name;
|
|
65
|
+
warmupTime;
|
|
66
|
+
warmupIterations;
|
|
67
|
+
time;
|
|
68
|
+
iterations;
|
|
69
|
+
memoryUsage;
|
|
70
|
+
checkReturnedValues;
|
|
71
|
+
_tasks = /* @__PURE__ */new Map();
|
|
72
|
+
onIterationStart = (0, _riim_event.event)();
|
|
73
|
+
onIterationEnd = (0, _riim_event.event)();
|
|
33
74
|
constructor({
|
|
34
75
|
name,
|
|
35
76
|
warmupTime = Infinity,
|
|
@@ -39,9 +80,6 @@ var Bench = class {
|
|
|
39
80
|
memoryUsage = false,
|
|
40
81
|
checkReturnedValues
|
|
41
82
|
} = {}) {
|
|
42
|
-
this._tasks = /* @__PURE__ */new Map();
|
|
43
|
-
this.onIterationStart = event();
|
|
44
|
-
this.onIterationEnd = event();
|
|
45
83
|
this.name = name;
|
|
46
84
|
this.warmupTime = warmupTime;
|
|
47
85
|
this.warmupIterations = warmupIterations;
|
|
@@ -84,22 +122,25 @@ var Bench = class {
|
|
|
84
122
|
}
|
|
85
123
|
if (warmupTime != Infinity || warmupIterations != Infinity) {
|
|
86
124
|
var _taskFnParams = {
|
|
125
|
+
iteration: -1,
|
|
87
126
|
timeStart: noop,
|
|
88
127
|
timeEnd: noop
|
|
89
128
|
};
|
|
90
129
|
for (var i = 0, startTime = Date.now();; i++) {
|
|
91
|
-
|
|
130
|
+
_taskFnParams.iteration = i;
|
|
131
|
+
(0, _riim_event.fireEvent)(this.onIterationStart);
|
|
92
132
|
for (var j = 0, k = tasks.length; j < k; j++) {
|
|
93
133
|
var returnedValue = tasks[j].fn(_taskFnParams);
|
|
94
134
|
if (returnedValue instanceof Promise) await returnedValue;
|
|
95
135
|
}
|
|
96
|
-
fireEvent(this.onIterationEnd);
|
|
136
|
+
(0, _riim_event.fireEvent)(this.onIterationEnd);
|
|
97
137
|
if (Date.now() - startTime >= warmupTime || i >= warmupIterations) break;
|
|
98
138
|
}
|
|
99
139
|
}
|
|
100
140
|
var taskStartTime;
|
|
101
141
|
var taskEndTime;
|
|
102
142
|
var taskFnParams = {
|
|
143
|
+
iteration: -1,
|
|
103
144
|
timeStart: () => {
|
|
104
145
|
taskStartTime = performance.now();
|
|
105
146
|
},
|
|
@@ -109,8 +150,9 @@ var Bench = class {
|
|
|
109
150
|
};
|
|
110
151
|
for (var _i = 0, _startTime = Date.now();; _i++) {
|
|
111
152
|
tasks.sort(() => Math.random() - .5);
|
|
153
|
+
taskFnParams.iteration = _i;
|
|
112
154
|
var returnedValues = checkReturnedValues ? [] : null;
|
|
113
|
-
fireEvent(this.onIterationStart);
|
|
155
|
+
(0, _riim_event.fireEvent)(this.onIterationStart);
|
|
114
156
|
for (var _j = 0, m = tasks.length; _j < m; _j++) {
|
|
115
157
|
var {
|
|
116
158
|
name,
|
|
@@ -137,8 +179,8 @@ var Bench = class {
|
|
|
137
179
|
completionTimeMeasurements.push(taskEndTime - taskStartTime);
|
|
138
180
|
returnedValues?.push([name, _returnedValue]);
|
|
139
181
|
}
|
|
140
|
-
checkReturnedValues?.(returnedValues);
|
|
141
|
-
fireEvent(this.onIterationEnd);
|
|
182
|
+
checkReturnedValues?.(returnedValues, _i);
|
|
183
|
+
(0, _riim_event.fireEvent)(this.onIterationEnd);
|
|
142
184
|
if (Date.now() - _startTime >= time || _i >= iterations) break;
|
|
143
185
|
}
|
|
144
186
|
}
|
|
@@ -179,7 +221,7 @@ var Bench = class {
|
|
|
179
221
|
}]) => a - b);
|
|
180
222
|
}
|
|
181
223
|
table({
|
|
182
|
-
verbose =
|
|
224
|
+
verbose = true
|
|
183
225
|
} = {}) {
|
|
184
226
|
var formattedMeasurements = this._formatMeasurements({
|
|
185
227
|
verbose
|
|
@@ -239,4 +281,4 @@ var Bench = class {
|
|
|
239
281
|
};
|
|
240
282
|
|
|
241
283
|
//#endregion
|
|
242
|
-
|
|
284
|
+
exports.Bench = Bench;
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from './Bench';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riim/bench",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"homepage": "https://github.com/Riim/bench#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -17,25 +17,25 @@
|
|
|
17
17
|
"typings": "dist/index.d.ts",
|
|
18
18
|
"scripts": {
|
|
19
19
|
"build": "rm -rf dist && npx tsc && rolldown -c && babel dist --out-dir dist",
|
|
20
|
-
"test": "
|
|
20
|
+
"test": "rm -rf coverage && jest --coverage"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@babel/cli": "7.28.6",
|
|
24
24
|
"@babel/core": "7.29.0",
|
|
25
25
|
"@babel/plugin-transform-block-scoping": "7.28.6",
|
|
26
|
-
"@eslint/js": "9.39.
|
|
26
|
+
"@eslint/js": "9.39.3",
|
|
27
27
|
"@trivago/prettier-plugin-sort-imports": "6.0.2",
|
|
28
|
-
"@types/node": "25.2
|
|
29
|
-
"@typescript-eslint/parser": "8.
|
|
30
|
-
"eslint": "9.39.
|
|
28
|
+
"@types/node": "25.3.2",
|
|
29
|
+
"@typescript-eslint/parser": "8.56.1",
|
|
30
|
+
"eslint": "9.39.3",
|
|
31
31
|
"eslint-plugin-github": "6.0.0",
|
|
32
32
|
"globals": "17.3.0",
|
|
33
|
-
"rolldown": "1.0.0-rc.
|
|
33
|
+
"rolldown": "1.0.0-rc.6",
|
|
34
34
|
"typescript": "5.9.3",
|
|
35
|
-
"typescript-eslint": "8.
|
|
35
|
+
"typescript-eslint": "8.56.1"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@riim/event": "0.
|
|
38
|
+
"@riim/event": "0.2.0",
|
|
39
39
|
"jstat": "1.9.6"
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { Bench } from '../src';
|
|
2
|
-
|
|
3
|
-
const arr = Array.from({ length: 1000 }, (_, idx) => idx + 1);
|
|
4
|
-
let item: number;
|
|
5
|
-
|
|
6
|
-
const bench = new Bench({ time: 1000 });
|
|
7
|
-
|
|
8
|
-
bench
|
|
9
|
-
.add('by index with l-var', () => {
|
|
10
|
-
for (let i = 0, l = arr.length; i < l; i++) {
|
|
11
|
-
item = arr[i];
|
|
12
|
-
}
|
|
13
|
-
})
|
|
14
|
-
.add('by index without l-var', () => {
|
|
15
|
-
for (let i = 0; i < arr.length; i++) {
|
|
16
|
-
item = arr[i];
|
|
17
|
-
}
|
|
18
|
-
})
|
|
19
|
-
.add('by index without l-var 2', () => {
|
|
20
|
-
for (let i = 0; i != arr.length; i++) {
|
|
21
|
-
item = arr[i];
|
|
22
|
-
}
|
|
23
|
-
})
|
|
24
|
-
.add('by index from end', () => {
|
|
25
|
-
for (let i = arr.length; i != 0; ) {
|
|
26
|
-
item = arr[--i];
|
|
27
|
-
}
|
|
28
|
-
})
|
|
29
|
-
.add('by index from end 2', () => {
|
|
30
|
-
for (let i = arr.length - 1; i >= 0; i--) {
|
|
31
|
-
item = arr[i];
|
|
32
|
-
}
|
|
33
|
-
})
|
|
34
|
-
.add('of operator', () => {
|
|
35
|
-
for (let item_ of arr) {
|
|
36
|
-
item = item_;
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
.add('Array#forEach()', () => {
|
|
40
|
-
arr.forEach((item_) => {
|
|
41
|
-
item = item_;
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
(async () => {
|
|
46
|
-
await bench.run();
|
|
47
|
-
|
|
48
|
-
// ┌──────────────────────────┬─────┬──────────┬──────────┐
|
|
49
|
-
// │ (index) │ pos │ mean │ rme │
|
|
50
|
-
// ├──────────────────────────┼─────┼──────────┼──────────┤
|
|
51
|
-
// │ by index with l-var │ 100 │ 0.001055 │ '±0.52%' │
|
|
52
|
-
// │ by index without l-var │ 100 │ 0.001057 │ '±1.22%' │
|
|
53
|
-
// │ Array#forEach() │ 87 │ 0.001217 │ '±1.74%' │
|
|
54
|
-
// │ by index without l-var 2 │ 72 │ 0.001458 │ '±0.4%' │
|
|
55
|
-
// │ by index from end 2 │ 72 │ 0.001461 │ '±0.3%' │
|
|
56
|
-
// │ of operator │ 68 │ 0.001544 │ '±0.37%' │
|
|
57
|
-
// │ by index from end │ 58 │ 0.001833 │ '±0.42%' │
|
|
58
|
-
// └──────────────────────────┴─────┴──────────┴──────────┘
|
|
59
|
-
console.table(bench.table());
|
|
60
|
-
|
|
61
|
-
await bench.run({ memoryUsage: true });
|
|
62
|
-
|
|
63
|
-
// ┌──────────────────────────┬─────┬─────┬──────┬──────┐
|
|
64
|
-
// │ (index) │ pos │ min │ max │ mean │
|
|
65
|
-
// ├──────────────────────────┼─────┼─────┼──────┼──────┤
|
|
66
|
-
// │ by index with l-var │ 100 │ 448 │ 600 │ 448 │
|
|
67
|
-
// │ by index without l-var │ 100 │ 448 │ 3880 │ 448 │
|
|
68
|
-
// │ by index without l-var 2 │ 100 │ 448 │ 3848 │ 448 │
|
|
69
|
-
// │ by index from end │ 100 │ 448 │ 3848 │ 448 │
|
|
70
|
-
// │ by index from end 2 │ 100 │ 448 │ 3848 │ 448 │
|
|
71
|
-
// │ of operator │ 100 │ 448 │ 4080 │ 448 │
|
|
72
|
-
// │ Array#forEach() │ 89 │ 504 │ 4032 │ 504 │
|
|
73
|
-
// └──────────────────────────┴─────┴─────┴──────┴──────┘
|
|
74
|
-
console.table(bench.memoryUsageTable());
|
|
75
|
-
})();
|