420 lines
10 KiB
Plaintext
420 lines
10 KiB
Plaintext
|
"use strict";
|
||
|
var w = Object.defineProperty;
|
||
|
var P = Object.getOwnPropertyDescriptor;
|
||
|
var q = Object.getOwnPropertyNames;
|
||
|
var V = Object.prototype.hasOwnProperty;
|
||
|
var C = (s, r, t) => r in s ? w(s, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[r] = t;
|
||
|
var $ = (s, r) => {
|
||
|
for (var t in r)
|
||
|
w(s, t, { get: r[t], enumerable: !0 });
|
||
|
}, D = (s, r, t, e) => {
|
||
|
if (r && typeof r == "object" || typeof r == "function")
|
||
|
for (let n of q(r))
|
||
|
!V.call(s, n) && n !== t && w(s, n, { get: () => r[n], enumerable: !(e = P(r, n)) || e.enumerable });
|
||
|
return s;
|
||
|
};
|
||
|
var G = (s) => D(w({}, "__esModule", { value: !0 }), s);
|
||
|
var i = (s, r, t) => (C(s, typeof r != "symbol" ? r + "" : r, t), t);
|
||
|
|
||
|
// src/index.ts
|
||
|
var Z = {};
|
||
|
$(Z, {
|
||
|
Bench: () => m,
|
||
|
Task: () => p,
|
||
|
default: () => Y,
|
||
|
hrtimeNow: () => R,
|
||
|
now: () => E
|
||
|
});
|
||
|
module.exports = G(Z);
|
||
|
|
||
|
// src/event.ts
|
||
|
function a(s, r = null) {
|
||
|
let t = new Event(s);
|
||
|
return Object.defineProperty(t, "task", {
|
||
|
value: r,
|
||
|
enumerable: !0,
|
||
|
writable: !1,
|
||
|
configurable: !1
|
||
|
}), t;
|
||
|
}
|
||
|
|
||
|
// src/constants.ts
|
||
|
var J = {
|
||
|
1: 12.71,
|
||
|
2: 4.303,
|
||
|
3: 3.182,
|
||
|
4: 2.776,
|
||
|
5: 2.571,
|
||
|
6: 2.447,
|
||
|
7: 2.365,
|
||
|
8: 2.306,
|
||
|
9: 2.262,
|
||
|
10: 2.228,
|
||
|
11: 2.201,
|
||
|
12: 2.179,
|
||
|
13: 2.16,
|
||
|
14: 2.145,
|
||
|
15: 2.131,
|
||
|
16: 2.12,
|
||
|
17: 2.11,
|
||
|
18: 2.101,
|
||
|
19: 2.093,
|
||
|
20: 2.086,
|
||
|
21: 2.08,
|
||
|
22: 2.074,
|
||
|
23: 2.069,
|
||
|
24: 2.064,
|
||
|
25: 2.06,
|
||
|
26: 2.056,
|
||
|
27: 2.052,
|
||
|
28: 2.048,
|
||
|
29: 2.045,
|
||
|
30: 2.042,
|
||
|
31: 2.0399,
|
||
|
32: 2.0378,
|
||
|
33: 2.0357,
|
||
|
34: 2.0336,
|
||
|
35: 2.0315,
|
||
|
36: 2.0294,
|
||
|
37: 2.0273,
|
||
|
38: 2.0252,
|
||
|
39: 2.0231,
|
||
|
40: 2.021,
|
||
|
41: 2.0198,
|
||
|
42: 2.0186,
|
||
|
43: 2.0174,
|
||
|
44: 2.0162,
|
||
|
45: 2.015,
|
||
|
46: 2.0138,
|
||
|
47: 2.0126,
|
||
|
48: 2.0114,
|
||
|
49: 2.0102,
|
||
|
50: 2.009,
|
||
|
51: 2.0081,
|
||
|
52: 2.0072,
|
||
|
53: 2.0063,
|
||
|
54: 2.0054,
|
||
|
55: 2.0045,
|
||
|
56: 2.0036,
|
||
|
57: 2.0027,
|
||
|
58: 2.0018,
|
||
|
59: 2.0009,
|
||
|
60: 2,
|
||
|
61: 1.9995,
|
||
|
62: 1.999,
|
||
|
63: 1.9985,
|
||
|
64: 1.998,
|
||
|
65: 1.9975,
|
||
|
66: 1.997,
|
||
|
67: 1.9965,
|
||
|
68: 1.996,
|
||
|
69: 1.9955,
|
||
|
70: 1.995,
|
||
|
71: 1.9945,
|
||
|
72: 1.994,
|
||
|
73: 1.9935,
|
||
|
74: 1.993,
|
||
|
75: 1.9925,
|
||
|
76: 1.992,
|
||
|
77: 1.9915,
|
||
|
78: 1.991,
|
||
|
79: 1.9905,
|
||
|
80: 1.99,
|
||
|
81: 1.9897,
|
||
|
82: 1.9894,
|
||
|
83: 1.9891,
|
||
|
84: 1.9888,
|
||
|
85: 1.9885,
|
||
|
86: 1.9882,
|
||
|
87: 1.9879,
|
||
|
88: 1.9876,
|
||
|
89: 1.9873,
|
||
|
90: 1.987,
|
||
|
91: 1.9867,
|
||
|
92: 1.9864,
|
||
|
93: 1.9861,
|
||
|
94: 1.9858,
|
||
|
95: 1.9855,
|
||
|
96: 1.9852,
|
||
|
97: 1.9849,
|
||
|
98: 1.9846,
|
||
|
99: 1.9843,
|
||
|
100: 1.984,
|
||
|
101: 1.9838,
|
||
|
102: 1.9836,
|
||
|
103: 1.9834,
|
||
|
104: 1.9832,
|
||
|
105: 1.983,
|
||
|
106: 1.9828,
|
||
|
107: 1.9826,
|
||
|
108: 1.9824,
|
||
|
109: 1.9822,
|
||
|
110: 1.982,
|
||
|
111: 1.9818,
|
||
|
112: 1.9816,
|
||
|
113: 1.9814,
|
||
|
114: 1.9812,
|
||
|
115: 1.9819,
|
||
|
116: 1.9808,
|
||
|
117: 1.9806,
|
||
|
118: 1.9804,
|
||
|
119: 1.9802,
|
||
|
120: 1.98,
|
||
|
infinity: 1.96
|
||
|
}, g = J;
|
||
|
|
||
|
// src/utils.ts
|
||
|
var Q = (s) => s / 1e6, R = () => Q(Number(process.hrtime.bigint())), E = () => performance.now();
|
||
|
function U(s) {
|
||
|
return s !== null && typeof s == "object" && typeof s.then == "function";
|
||
|
}
|
||
|
var O = (s) => s.reduce((r, t) => r + t, 0) / s.length || 0, F = (s, r) => s.reduce((e, n) => e + (n - r) ** 2, 0) / (s.length - 1) || 0, W = (async () => {
|
||
|
}).constructor, X = (s) => s.constructor === W, k = async (s) => {
|
||
|
if (X(s.fn))
|
||
|
return !0;
|
||
|
try {
|
||
|
if (s.opts.beforeEach != null)
|
||
|
try {
|
||
|
await s.opts.beforeEach.call(s);
|
||
|
} catch (e) {
|
||
|
}
|
||
|
let r = s.fn(), t = U(r);
|
||
|
if (t)
|
||
|
try {
|
||
|
await r;
|
||
|
} catch (e) {
|
||
|
}
|
||
|
if (s.opts.afterEach != null)
|
||
|
try {
|
||
|
await s.opts.afterEach.call(s);
|
||
|
} catch (e) {
|
||
|
}
|
||
|
return t;
|
||
|
} catch (r) {
|
||
|
return !1;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/task.ts
|
||
|
var p = class extends EventTarget {
|
||
|
constructor(t, e, n, h = {}) {
|
||
|
super();
|
||
|
i(this, "bench");
|
||
|
i(this, "name");
|
||
|
i(this, "fn");
|
||
|
i(this, "runs", 0);
|
||
|
i(this, "result");
|
||
|
i(this, "opts");
|
||
|
this.bench = t, this.name = e, this.fn = n, this.opts = h;
|
||
|
}
|
||
|
async run() {
|
||
|
var h, c, f, d;
|
||
|
this.dispatchEvent(a("start", this));
|
||
|
let t = 0, e = [];
|
||
|
if (await this.bench.setup(this, "run"), this.opts.beforeAll != null)
|
||
|
try {
|
||
|
await this.opts.beforeAll.call(this);
|
||
|
} catch (o) {
|
||
|
this.setResult({ error: o });
|
||
|
}
|
||
|
let n = await k(this);
|
||
|
try {
|
||
|
for (; (t < this.bench.time || this.runs < this.bench.iterations) && !((h = this.bench.signal) != null && h.aborted); ) {
|
||
|
this.opts.beforeEach != null && await this.opts.beforeEach.call(this);
|
||
|
let o = 0;
|
||
|
if (n) {
|
||
|
let l = this.bench.now();
|
||
|
await this.fn.call(this), o = this.bench.now() - l;
|
||
|
} else {
|
||
|
let l = this.bench.now();
|
||
|
this.fn.call(this), o = this.bench.now() - l;
|
||
|
}
|
||
|
e.push(o), this.runs += 1, t += o, this.opts.afterEach != null && await this.opts.afterEach.call(this);
|
||
|
}
|
||
|
} catch (o) {
|
||
|
if (this.setResult({ error: o }), this.bench.throws)
|
||
|
throw o;
|
||
|
}
|
||
|
if (this.opts.afterAll != null)
|
||
|
try {
|
||
|
await this.opts.afterAll.call(this);
|
||
|
} catch (o) {
|
||
|
this.setResult({ error: o });
|
||
|
}
|
||
|
if (await this.bench.teardown(this, "run"), !((c = this.result) != null && c.error)) {
|
||
|
e.sort((j, z) => j - z);
|
||
|
let o = t / this.runs, l = 1e3 / o, u = e.length, b = u - 1, B = e[0], K = e[b], T = O(e), y = F(e, T), A = Math.sqrt(y), x = A / Math.sqrt(u), L = g[String(Math.round(b) || 1)] || g.infinity, M = x * L, N = M / T * 100, _ = e[Math.ceil(u * 0.75) - 1], S = e[Math.ceil(u * 0.99) - 1], I = e[Math.ceil(u * 0.995) - 1], H = e[Math.ceil(u * 0.999) - 1];
|
||
|
if ((f = this.bench.signal) != null && f.aborted)
|
||
|
return this;
|
||
|
this.setResult({
|
||
|
totalTime: t,
|
||
|
min: B,
|
||
|
max: K,
|
||
|
hz: l,
|
||
|
period: o,
|
||
|
samples: e,
|
||
|
mean: T,
|
||
|
variance: y,
|
||
|
sd: A,
|
||
|
sem: x,
|
||
|
df: b,
|
||
|
critical: L,
|
||
|
moe: M,
|
||
|
rme: N,
|
||
|
p75: _,
|
||
|
p99: S,
|
||
|
p995: I,
|
||
|
p999: H
|
||
|
});
|
||
|
}
|
||
|
return (d = this.result) != null && d.error && (this.dispatchEvent(a("error", this)), this.bench.dispatchEvent(a("error", this))), this.dispatchEvent(a("cycle", this)), this.bench.dispatchEvent(a("cycle", this)), this.dispatchEvent(a("complete", this)), this;
|
||
|
}
|
||
|
async warmup() {
|
||
|
var h;
|
||
|
this.dispatchEvent(a("warmup", this));
|
||
|
let t = this.bench.now(), e = 0;
|
||
|
if (await this.bench.setup(this, "warmup"), this.opts.beforeAll != null)
|
||
|
try {
|
||
|
await this.opts.beforeAll.call(this);
|
||
|
} catch (c) {
|
||
|
this.setResult({ error: c });
|
||
|
}
|
||
|
let n = await k(this);
|
||
|
for (; (e < this.bench.warmupTime || this.runs < this.bench.warmupIterations) && !((h = this.bench.signal) != null && h.aborted); ) {
|
||
|
if (this.opts.beforeEach != null)
|
||
|
try {
|
||
|
await this.opts.beforeEach.call(this);
|
||
|
} catch (c) {
|
||
|
this.setResult({ error: c });
|
||
|
}
|
||
|
try {
|
||
|
n ? await this.fn.call(this) : this.fn.call(this);
|
||
|
} catch (c) {
|
||
|
if (this.bench.throws)
|
||
|
throw c;
|
||
|
}
|
||
|
if (this.runs += 1, e = this.bench.now() - t, this.opts.afterEach != null)
|
||
|
try {
|
||
|
await this.opts.afterEach.call(this);
|
||
|
} catch (c) {
|
||
|
this.setResult({ error: c });
|
||
|
}
|
||
|
}
|
||
|
if (this.opts.afterAll != null)
|
||
|
try {
|
||
|
await this.opts.afterAll.call(this);
|
||
|
} catch (c) {
|
||
|
this.setResult({ error: c });
|
||
|
}
|
||
|
this.bench.teardown(this, "warmup"), this.runs = 0;
|
||
|
}
|
||
|
addEventListener(t, e, n) {
|
||
|
super.addEventListener(t, e, n);
|
||
|
}
|
||
|
removeEventListener(t, e, n) {
|
||
|
super.removeEventListener(t, e, n);
|
||
|
}
|
||
|
setResult(t) {
|
||
|
this.result = { ...this.result, ...t }, Object.freeze(this.reset);
|
||
|
}
|
||
|
reset() {
|
||
|
this.dispatchEvent(a("reset", this)), this.runs = 0, this.result = void 0;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/bench.ts
|
||
|
var m = class extends EventTarget {
|
||
|
constructor(t = {}) {
|
||
|
var e, n, h, c, f, d, o, l;
|
||
|
super();
|
||
|
i(this, "_tasks", /* @__PURE__ */ new Map());
|
||
|
i(this, "_todos", /* @__PURE__ */ new Map());
|
||
|
i(this, "signal");
|
||
|
i(this, "throws");
|
||
|
i(this, "warmupTime", 100);
|
||
|
i(this, "warmupIterations", 5);
|
||
|
i(this, "time", 500);
|
||
|
i(this, "iterations", 10);
|
||
|
i(this, "now", E);
|
||
|
i(this, "setup");
|
||
|
i(this, "teardown");
|
||
|
this.now = (e = t.now) != null ? e : this.now, this.warmupTime = (n = t.warmupTime) != null ? n : this.warmupTime, this.warmupIterations = (h = t.warmupIterations) != null ? h : this.warmupIterations, this.time = (c = t.time) != null ? c : this.time, this.iterations = (f = t.iterations) != null ? f : this.iterations, this.signal = t.signal, this.throws = (d = t.throws) != null ? d : !1, this.setup = (o = t.setup) != null ? o : () => {
|
||
|
}, this.teardown = (l = t.teardown) != null ? l : () => {
|
||
|
}, this.signal && this.signal.addEventListener(
|
||
|
"abort",
|
||
|
() => {
|
||
|
this.dispatchEvent(a("abort"));
|
||
|
},
|
||
|
{ once: !0 }
|
||
|
);
|
||
|
}
|
||
|
async run() {
|
||
|
var e;
|
||
|
this.dispatchEvent(a("start"));
|
||
|
let t = [];
|
||
|
for (let n of [...this._tasks.values()])
|
||
|
(e = this.signal) != null && e.aborted ? t.push(n) : t.push(await n.run());
|
||
|
return this.dispatchEvent(a("complete")), t;
|
||
|
}
|
||
|
async warmup() {
|
||
|
this.dispatchEvent(a("warmup"));
|
||
|
for (let [, t] of this._tasks)
|
||
|
await t.warmup();
|
||
|
}
|
||
|
reset() {
|
||
|
this.dispatchEvent(a("reset")), this._tasks.forEach((t) => {
|
||
|
t.reset();
|
||
|
});
|
||
|
}
|
||
|
add(t, e, n = {}) {
|
||
|
let h = new p(this, t, e, n);
|
||
|
return this._tasks.set(t, h), this.dispatchEvent(a("add", h)), this;
|
||
|
}
|
||
|
todo(t, e = () => {
|
||
|
}, n = {}) {
|
||
|
let h = new p(this, t, e, n);
|
||
|
return this._todos.set(t, h), this.dispatchEvent(a("todo", h)), this;
|
||
|
}
|
||
|
remove(t) {
|
||
|
let e = this.getTask(t);
|
||
|
return e && (this.dispatchEvent(a("remove", e)), this._tasks.delete(t)), this;
|
||
|
}
|
||
|
addEventListener(t, e, n) {
|
||
|
super.addEventListener(t, e, n);
|
||
|
}
|
||
|
removeEventListener(t, e, n) {
|
||
|
super.removeEventListener(t, e, n);
|
||
|
}
|
||
|
table() {
|
||
|
return this.tasks.map(({ name: t, result: e }) => e ? {
|
||
|
"Task Name": t,
|
||
|
"ops/sec": e.error ? "NaN" : parseInt(e.hz.toString(), 10).toLocaleString(),
|
||
|
"Average Time (ns)": e.error ? "NaN" : e.mean * 1e3 * 1e3,
|
||
|
Margin: e.error ? "NaN" : `\xB1${e.rme.toFixed(2)}%`,
|
||
|
Samples: e.error ? "NaN" : e.samples.length
|
||
|
} : null);
|
||
|
}
|
||
|
get results() {
|
||
|
return [...this._tasks.values()].map((t) => t.result);
|
||
|
}
|
||
|
get tasks() {
|
||
|
return [...this._tasks.values()];
|
||
|
}
|
||
|
get todos() {
|
||
|
return [...this._todos.values()];
|
||
|
}
|
||
|
getTask(t) {
|
||
|
return this._tasks.get(t);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/index.ts
|
||
|
var Y = m;
|
||
|
// Annotate the CommonJS export names for ESM import in node:
|
||
|
0 && (module.exports = {
|
||
|
Bench,
|
||
|
Task,
|
||
|
hrtimeNow,
|
||
|
now
|
||
|
});
|