@riim/bench 0.1.1 → 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 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) => any;
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: any];
13
- export type TCheckReturnedValues = (returnedValues: Array<TReturnedValue>) => void;
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
- import { event, fireEvent } from "@riim/event";
2
- import jstat from "jstat";
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
- fireEvent(this.onIterationStart);
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 = false
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
- export { Bench };
284
+ exports.Bench = Bench;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riim/bench",
3
- "version": "0.1.1",
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": "echo \"Error: no test specified\" && exit 1"
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.2",
26
+ "@eslint/js": "9.39.3",
27
27
  "@trivago/prettier-plugin-sort-imports": "6.0.2",
28
- "@types/node": "25.2.3",
29
- "@typescript-eslint/parser": "8.55.0",
30
- "eslint": "9.39.2",
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.4",
33
+ "rolldown": "1.0.0-rc.6",
34
34
  "typescript": "5.9.3",
35
- "typescript-eslint": "8.55.0"
35
+ "typescript-eslint": "8.56.1"
36
36
  },
37
37
  "dependencies": {
38
- "@riim/event": "0.1.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
- })();