extra-benchmark 0.2.4 → 0.3.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
@@ -61,9 +61,9 @@ interface IBenchmarkCaseResult {
61
61
  operationsPerMillisecond: number
62
62
 
63
63
  /* Milliseconds */
64
- maxiumElapsedTime: bigint
65
- minimumElapsedTime: bigint
66
- averageElapsedTime: bigint
64
+ maxiumElapsedTime: number
65
+ minimumElapsedTime: number
66
+ averageElapsedTime: number
67
67
 
68
68
  /* Bytes */
69
69
  maximumMemoryIncrements: number
@@ -89,10 +89,10 @@ class Benchmark {
89
89
  name: string
90
90
  , fn: () => Awaitable<
91
91
  // iterate(): afterEach
92
- | (() => Awaitable<(() => Awaitable<void>) | Falsy>)
92
+ | (() => Awaitable<void | (() => Awaitable<void>)>)
93
93
  | {
94
94
  // iterate(): afterEach
95
- iterate: () => Awaitable<(() => Awaitable<void>) | Falsy>
95
+ iterate: () => Awaitable<void | (() => Awaitable<void>)>
96
96
  beforeEach?: () => Awaitable<void>
97
97
  afterAll?: () => Awaitable<void>
98
98
  }
@@ -23,7 +23,7 @@ export declare class Benchmark {
23
23
  private runs;
24
24
  constructor(name: string, options?: IBenchmarkOptions);
25
25
  addCase(name: string, fn: () => Awaitable<(() => Awaitable<void | (() => Awaitable<void>)>) | {
26
- iterate: () => Awaitable<void | (() => void)>;
26
+ iterate: () => Awaitable<void | (() => Awaitable<void>)>;
27
27
  beforeEach?: () => Awaitable<void>;
28
28
  afterAll?: () => Awaitable<void>;
29
29
  }>, options?: IBenchmarkOptions): void;
package/lib/benchmark.js CHANGED
@@ -1,27 +1,28 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Benchmark = void 0;
4
- const prelude_1 = require("@blackglory/prelude");
5
- const perf_hooks_1 = require("perf_hooks");
6
- class Benchmark {
1
+ import { pass, isFunction } from '@blackglory/prelude';
2
+ import { max, min, sum } from 'extra-utils';
3
+ import { avg } from 'iterable-operator';
4
+ import { performance } from 'perf_hooks';
5
+ export class Benchmark {
7
6
  constructor(name, options = {}) {
7
+ var _a, _b;
8
8
  this.name = name;
9
9
  this.benchmarkCases = [];
10
- this.warms = options.warms ?? 100;
11
- this.runs = options.runs ?? 100;
10
+ this.warms = (_a = options.warms) !== null && _a !== void 0 ? _a : 100;
11
+ this.runs = (_b = options.runs) !== null && _b !== void 0 ? _b : 100;
12
12
  }
13
13
  addCase(name, fn, options = {}) {
14
14
  this.benchmarkCases.push({ name, fn, options });
15
15
  }
16
16
  async *run() {
17
+ var _a, _b, _c, _d;
17
18
  for (const benchmarkCase of this.benchmarkCases) {
18
19
  const { fn, name, options } = benchmarkCase;
19
20
  const result = await fn();
20
- const iterate = (0, prelude_1.isFunction)(result) ? result : result.iterate;
21
- const beforeEach = (0, prelude_1.isFunction)(result) ? prelude_1.pass : (result.beforeEach ?? prelude_1.pass);
22
- const afterAll = (0, prelude_1.isFunction)(result) ? prelude_1.pass : (result.afterAll ?? prelude_1.pass);
23
- const warms = options.warms ?? this.warms;
24
- const runs = options.runs ?? this.runs;
21
+ const iterate = isFunction(result) ? result : result.iterate;
22
+ const beforeEach = isFunction(result) ? pass : ((_a = result.beforeEach) !== null && _a !== void 0 ? _a : pass);
23
+ const afterAll = isFunction(result) ? pass : ((_b = result.afterAll) !== null && _b !== void 0 ? _b : pass);
24
+ const warms = (_c = options.warms) !== null && _c !== void 0 ? _c : this.warms;
25
+ const runs = (_d = options.runs) !== null && _d !== void 0 ? _d : this.runs;
25
26
  await sample({
26
27
  iterate,
27
28
  beforeEach,
@@ -34,27 +35,16 @@ class Benchmark {
34
35
  });
35
36
  await afterAll();
36
37
  const elapsedTimes = samples.map(x => x.elapsedTime);
37
- const maxiumElapsedTime = elapsedTimes.reduce((max, cur) => {
38
- return cur > max ? cur : max;
39
- });
40
- const minimumElapsedTime = elapsedTimes.reduce((min, cur) => {
41
- return cur > min ? min : cur;
42
- });
43
- const totalElapsedTime = elapsedTimes.reduce((acc, cur) => {
44
- return acc + cur;
45
- });
46
- const averageElapsedTime = totalElapsedTime / runs;
38
+ const maxiumElapsedTime = elapsedTimes.reduce(max);
39
+ const minimumElapsedTime = elapsedTimes.reduce(min);
40
+ const averageElapsedTime = avg(elapsedTimes);
41
+ const totalElapsedTime = elapsedTimes.reduce(sum);
47
42
  const operationsPerMillisecond = runs / totalElapsedTime;
48
43
  const operationsPerSecond = runs / (totalElapsedTime / 1000);
49
44
  const memoryIncrments = samples.map(x => x.memoryIncrements);
50
- const maximumMemoryIncrements = memoryIncrments.reduce((max, cur) => {
51
- return cur > max ? cur : max;
52
- });
53
- const minimumMemoryIncrements = memoryIncrments.reduce((min, cur) => {
54
- return cur > min ? min : cur;
55
- });
56
- const totalMemoryIncrements = memoryIncrments.reduce((average, cur) => average + cur);
57
- const averageMemoryIncrements = totalMemoryIncrements / memoryIncrments.length;
45
+ const maximumMemoryIncrements = memoryIncrments.reduce(max);
46
+ const minimumMemoryIncrements = memoryIncrments.reduce(min);
47
+ const averageMemoryIncrements = avg(memoryIncrments);
58
48
  yield {
59
49
  name,
60
50
  warms,
@@ -71,17 +61,16 @@ class Benchmark {
71
61
  }
72
62
  }
73
63
  }
74
- exports.Benchmark = Benchmark;
75
64
  async function sample({ iterate, beforeEach, times }) {
76
65
  const samples = [];
77
- for (let i = times; i--;) {
66
+ for (let i = 0; i < times; i++) {
78
67
  await beforeEach();
79
68
  const startRSS = process.memoryUsage().rss;
80
- const startTime = perf_hooks_1.performance.now();
69
+ const startTime = performance.now();
81
70
  const afterEach = await iterate();
82
- const endTime = perf_hooks_1.performance.now();
71
+ const endTime = performance.now();
83
72
  const endRSS = process.memoryUsage().rss;
84
- if ((0, prelude_1.isFunction)(afterEach)) {
73
+ if (isFunction(afterEach)) {
85
74
  await afterEach();
86
75
  }
87
76
  const elapsedTime = endTime - startTime;
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './benchmark';
1
+ export * from './benchmark.js';
package/lib/index.js CHANGED
@@ -1,18 +1,2 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./benchmark"), exports);
1
+ export * from './benchmark.js';
18
2
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
package/package.json CHANGED
@@ -1,57 +1,60 @@
1
1
  {
2
2
  "name": "extra-benchmark",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "Lightweight benchmarking library.",
5
5
  "keywords": [],
6
6
  "files": [
7
7
  "lib",
8
8
  "src"
9
9
  ],
10
+ "type": "module",
10
11
  "main": "lib/index.js",
11
12
  "types": "lib/index.d.ts",
12
13
  "sideEffects": false,
14
+ "engines": {
15
+ "node": ">=22"
16
+ },
13
17
  "repository": "git@github.com:BlackGlory/extra-benchmark.git",
14
18
  "author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
15
19
  "license": "MIT",
16
20
  "scripts": {
21
+ "prepare": "ts-patch install -s",
17
22
  "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src __tests__",
18
- "test": "jest --runInBand --config jest.config.js",
19
- "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
20
- "test:coverage": "jest --coverage --config jest.config.js",
21
- "prepublishOnly": "run-s clean build",
23
+ "test": "vitest run",
24
+ "prepublishOnly": "run-s prepare clean build",
22
25
  "clean": "rimraf lib",
23
- "build": "run-s build:*",
24
- "build:compile": "tsc --project tsconfig.build.json --module commonjs",
25
- "build:patch": "tscpaths -p tsconfig.build.json -s ./src -o ./lib",
26
+ "build": "tsc --project tsconfig.build.json",
26
27
  "release": "standard-version"
27
28
  },
28
29
  "husky": {
29
30
  "hooks": {
30
- "pre-commit": "run-s lint build test",
31
+ "pre-commit": "run-s prepare lint build test",
31
32
  "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
32
33
  }
33
34
  },
34
35
  "devDependencies": {
35
- "@commitlint/cli": "^17.3.0",
36
- "@commitlint/config-conventional": "^17.3.0",
37
- "@types/jest": "^29.2.3",
38
- "@types/node": "16",
39
- "@typescript-eslint/eslint-plugin": "^5.44.0",
40
- "@typescript-eslint/parser": "^5.44.0",
41
- "eslint": "^8.28.0",
36
+ "@commitlint/cli": "^20.4.1",
37
+ "@commitlint/config-conventional": "^20.4.1",
38
+ "@eslint/js": "^10.0.1",
39
+ "@types/node": "22",
40
+ "eslint": "^10.0.0",
42
41
  "husky": "^4.3.8",
43
- "iterable-operator": "^2.5.0",
44
- "jest": "^29.3.1",
45
42
  "npm-run-all": "^4.1.5",
46
- "return-style": "^1.0.0",
47
- "rimraf": "^3.0.2",
43
+ "return-style": "^3.0.1",
44
+ "rimraf": "^6.1.2",
48
45
  "standard-version": "^9.5.0",
49
- "ts-jest": "^29.0.3",
50
- "tscpaths": "^0.0.9",
51
- "tslib": "^2.4.1",
52
- "typescript": "^4.9.3"
46
+ "ts-patch": "^3.3.0",
47
+ "tslib": "^2.8.1",
48
+ "typescript": "^5.9.3",
49
+ "typescript-eslint": "^8.55.0",
50
+ "typescript-transform-paths": "^3.5.6",
51
+ "vite": "^7.3.1",
52
+ "vite-tsconfig-paths": "^6.1.1",
53
+ "vitest": "^4.0.18"
53
54
  },
54
55
  "dependencies": {
55
- "@blackglory/prelude": "^0.1.8"
56
+ "@blackglory/prelude": "^0.4.0",
57
+ "extra-utils": "^5.20.0",
58
+ "iterable-operator": "^5.1.0"
56
59
  }
57
60
  }
package/src/benchmark.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { pass, Awaitable, isFunction } from '@blackglory/prelude'
2
+ import { max, min, sum } from 'extra-utils'
3
+ import { avg } from 'iterable-operator'
2
4
  import { performance } from 'perf_hooks'
3
5
 
4
6
  export interface IBenchmarkOptions {
@@ -31,9 +33,9 @@ export interface IBenchmarkCaseResult {
31
33
  interface IBenchmarkCase {
32
34
  name: string
33
35
  fn: () => Awaitable<
34
- | (() => Awaitable<void | (() => void)>) // iterate
36
+ | (() => Awaitable<void | (() => Awaitable<void>)>) // iterate
35
37
  | {
36
- iterate: () => Awaitable<void | (() => void)>
38
+ iterate: () => Awaitable<void | (() => Awaitable<void>)>
37
39
  beforeEach?: () => Awaitable<void>
38
40
  afterAll?: () => Awaitable<void>
39
41
  }
@@ -64,7 +66,7 @@ export class Benchmark {
64
66
  | (() => Awaitable<void | (() => Awaitable<void>)>)
65
67
  | {
66
68
  // iterate(): afterEach
67
- iterate: () => Awaitable<void | (() => void)>
69
+ iterate: () => Awaitable<void | (() => Awaitable<void>)>
68
70
  beforeEach?: () => Awaitable<void>
69
71
  afterAll?: () => Awaitable<void>
70
72
  }
@@ -101,29 +103,18 @@ export class Benchmark {
101
103
  await afterAll()
102
104
 
103
105
  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
106
+ const maxiumElapsedTime = elapsedTimes.reduce(max)
107
+ const minimumElapsedTime = elapsedTimes.reduce(min)
108
+ const averageElapsedTime = avg(elapsedTimes)
114
109
 
110
+ const totalElapsedTime = elapsedTimes.reduce(sum)
115
111
  const operationsPerMillisecond = runs / totalElapsedTime
116
112
  const operationsPerSecond = runs / (totalElapsedTime / 1000)
117
113
 
118
114
  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 totalMemoryIncrements = memoryIncrments.reduce((average, cur) => average + cur)
126
- const averageMemoryIncrements = totalMemoryIncrements / memoryIncrments.length
115
+ const maximumMemoryIncrements = memoryIncrments.reduce(max)
116
+ const minimumMemoryIncrements = memoryIncrments.reduce(min)
117
+ const averageMemoryIncrements = avg(memoryIncrments)
127
118
 
128
119
  yield {
129
120
  name
@@ -147,11 +138,10 @@ async function sample({ iterate, beforeEach, times }: {
147
138
  iterate: () => Awaitable<void | (() => Awaitable<void>)>
148
139
  , beforeEach: () => Awaitable<void>
149
140
  , times: number
150
- }
151
- ): Promise<ISample[]> {
141
+ }): Promise<ISample[]> {
152
142
  const samples: ISample[] = []
153
143
 
154
- for (let i = times; i--;) {
144
+ for (let i = 0; i < times; i++) {
155
145
  await beforeEach()
156
146
 
157
147
  const startRSS = process.memoryUsage().rss
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export * from './benchmark'
1
+ export * from './benchmark.js'