diff options
Diffstat (limited to 'bench')
-rwxr-xr-x | bench/bun.lockb | bin | 35848 -> 34640 bytes | |||
-rw-r--r-- | bench/emitter/implementations.mjs | 31 | ||||
-rw-r--r-- | bench/emitter/microbench.mjs | 96 | ||||
-rw-r--r-- | bench/emitter/microbench_once.mjs | 40 | ||||
-rw-r--r-- | bench/emitter/realworld_stream.mjs | 63 | ||||
-rw-r--r-- | bench/package.json | 10 | ||||
-rwxr-xr-x | bench/snippets/bun.lockb | bin | 0 -> 1477 bytes | |||
-rw-r--r-- | bench/snippets/emitter.mjs | 101 | ||||
-rw-r--r-- | bench/snippets/package.json | 7 |
9 files changed, 112 insertions, 236 deletions
diff --git a/bench/bun.lockb b/bench/bun.lockb Binary files differindex 298e2a7c9..abc5a11b4 100755 --- a/bench/bun.lockb +++ b/bench/bun.lockb diff --git a/bench/emitter/implementations.mjs b/bench/emitter/implementations.mjs deleted file mode 100644 index 2050ac38e..000000000 --- a/bench/emitter/implementations.mjs +++ /dev/null @@ -1,31 +0,0 @@ -import EventEmitter3 from "eventemitter3"; -import { group } from "mitata"; -import EventEmitterNative from "node:events"; - -export const implementations = [ - { - EventEmitter: EventEmitterNative, - name: process.isBun ? (EventEmitterNative.init ? "bun" : "C++") : "node:events", - monkey: true, - }, - // { EventEmitter: EventEmitter3, name: "EventEmitter3" }, -].filter(Boolean); - -for (const impl of implementations) { - impl.EventEmitter?.setMaxListeners?.(Infinity); -} - -export function groupForEmitter(name, cb) { - if (implementations.length === 1) { - return cb({ - ...implementations[0], - name: `${name}: ${implementations[0].name}`, - }); - } else { - return group(name, () => { - for (let impl of implementations) { - cb(impl); - } - }); - } -} diff --git a/bench/emitter/microbench.mjs b/bench/emitter/microbench.mjs deleted file mode 100644 index eae59d4c1..000000000 --- a/bench/emitter/microbench.mjs +++ /dev/null @@ -1,96 +0,0 @@ -import { bench, run } from "mitata"; -import { groupForEmitter } from "./implementations.mjs"; - -var id = 0; - -groupForEmitter("single emit", ({ EventEmitter, name }) => { - const emitter = new EventEmitter(); - - emitter.on("hello", event => { - event.preventDefault(); - }); - - bench(name, () => { - emitter.emit("hello", { - preventDefault() { - id++; - }, - }); - }); -}); - -groupForEmitter("on x 10_000 (handler)", ({ EventEmitter, name }) => { - const emitter = new EventEmitter(); - - bench(name, () => { - var cb = event => { - event.preventDefault(); - }; - emitter.on("hey", cb); - var called = false; - for (let i = 0; i < 10_000; i++) - emitter.emit("hey", { - preventDefault() { - id++; - called = true; - }, - }); - - if (!called) throw new Error("not called"); - }); -}); - -// for (let { impl: EventEmitter, name, monkey } of []) { -// if (monkey) { -// var monkeyEmitter = Object.assign({}, EventEmitter.prototype); -// monkeyEmitter.on("hello", event => { -// event.preventDefault(); -// }); - -// bench(`[monkey] ${className}.emit`, () => { -// var called = false; -// monkeyEmitter.emit("hello", { -// preventDefault() { -// id++; -// called = true; -// }, -// }); - -// if (!called) { -// throw new Error("monkey failed"); -// } -// }); - -// bench(`[monkey] ${className}.on x 10_000 (handler)`, () => { -// var cb = () => { -// event.preventDefault(); -// }; -// monkeyEmitter.on("hey", cb); -// for (let i = 0; i < 10_000; i++) -// monkey.emit("hey", { -// preventDefault() { -// id++; -// }, -// }); -// monkeyEmitter.off("hey", cb); -// }); -// } -// } - -// var target = new EventTarget(); -// target.addEventListener("hello", event => {}); -// bench("EventTarget.dispatch", () => { -// target.dispatchEvent(event); -// }); - -// var hey = new Event("hey"); - -// bench("EventTarget.on x 10_000 (handler)", () => { -// var handler = event => {}; -// target.addEventListener("hey", handler); - -// for (let i = 0; i < 10_000; i++) target.dispatchEvent(hey); -// target.removeEventListener("hey", handler); -// }); - -await run(); diff --git a/bench/emitter/microbench_once.mjs b/bench/emitter/microbench_once.mjs deleted file mode 100644 index b24fb2103..000000000 --- a/bench/emitter/microbench_once.mjs +++ /dev/null @@ -1,40 +0,0 @@ -import { bench, run } from "mitata"; -import { groupForEmitter } from "./implementations.mjs"; - -var id = 0; - -groupForEmitter("test 1", ({ EventEmitter, name }) => { - const emitter = new EventEmitter(); - - emitter.on("hello", event => { - event.preventDefault(); - }); - - bench(name, () => { - emitter.once("hello", event => { - event.preventDefault(); - }); - emitter.emit("hello", { - preventDefault() { - id++; - }, - }); - }); -}); - -groupForEmitter("test 2", ({ EventEmitter, name }) => { - const emitter = new EventEmitter(); - - bench(name, () => { - emitter.once("hello", event => { - event.preventDefault(); - }); - emitter.emit("hello", { - preventDefault() { - id++; - }, - }); - }); -}); - -await run(); diff --git a/bench/emitter/realworld_stream.mjs b/bench/emitter/realworld_stream.mjs deleted file mode 100644 index e65398b49..000000000 --- a/bench/emitter/realworld_stream.mjs +++ /dev/null @@ -1,63 +0,0 @@ -import { bench, run } from "mitata"; -import { groupForEmitter } from "./implementations.mjs"; - -// Psuedo RNG is derived from https://stackoverflow.com/a/424445 -let rngState = 123456789; -function nextInt() { - const m = 0x80000000; // 2**31; - const a = 1103515245; - const c = 12345; - rngState = (a * rngState + c) % m; - return rngState; -} -function nextRange(start, end) { - // returns in range [start, end): including start, excluding end - // can't modulu nextInt because of weak randomness in lower bits - const rangeSize = end - start; - const randomUnder1 = nextInt() / 0x7fffffff; // 2**31 - 1 - return start + Math.floor(randomUnder1 * rangeSize); -} - -const chunks = new Array(1024).fill(null).map((_, j) => { - const arr = new Uint8Array(1024); - for (let i = 0; i < arr.length; i++) { - arr[i] = nextRange(0, 256); - } - return arr; -}); - -groupForEmitter("stream simulation", ({ EventEmitter, name }) => { - bench(name, () => { - let id = 0; - const stream = new EventEmitter(); - - stream.on("start", res => { - if (res.status !== 200) throw new Error("not 200"); - }); - - const recived = []; - stream.on("data", req => { - recived.push(req); - }); - - stream.on("end", ev => { - ev.preventDefault(); - }); - - // simulate a stream - stream.emit("start", { status: 200 }); - for (let chunk of chunks) { - stream.emit("data", chunk); - } - stream.emit("end", { - preventDefault() { - id++; - }, - }); - - if (id !== 1) throw new Error("not implemented right"); - if (recived.length !== 1024) throw new Error("not implemented right"); - }); -}); - -await run(); diff --git a/bench/package.json b/bench/package.json index 501dd6f51..9cd47e043 100644 --- a/bench/package.json +++ b/bench/package.json @@ -1,13 +1,11 @@ { "name": "bench", "dependencies": { - "@babel/core": "^7.16.10", - "@babel/preset-react": "^7.16.7", - "@swc/core": "^1.2.133", - "benchmark": "^2.1.4", + "mitata": "^0.1.6", "esbuild": "^0.14.12", - "eventemitter3": "^5.0.0", - "mitata": "^0.1.6" + "@swc/core": "^1.2.133", + "@babel/core": "^7.16.10", + "@babel/preset-react": "^7.16.7" }, "scripts": { "ffi": "cd ffi && bun run deps && bun run build && bun run bench", diff --git a/bench/snippets/bun.lockb b/bench/snippets/bun.lockb Binary files differnew file mode 100755 index 000000000..3acb6d075 --- /dev/null +++ b/bench/snippets/bun.lockb diff --git a/bench/snippets/emitter.mjs b/bench/snippets/emitter.mjs new file mode 100644 index 000000000..f708cf77a --- /dev/null +++ b/bench/snippets/emitter.mjs @@ -0,0 +1,101 @@ +// **so this file can run in node** +import { createRequire } from "node:module"; +const require = createRequire(import.meta.url); +// -- + +const EventEmitterNative = require("node:events").EventEmitter; +const TypedEmitter = require("tiny-typed-emitter").TypedEmitter; +const EventEmitter3 = require("eventemitter3").EventEmitter; +import { bench, run } from "../../node_modules/mitata/src/cli.mjs"; +const event = new Event("hello"); +var id = 0; +for (let [EventEmitter, className] of [ + [EventEmitterNative, "EventEmitter"], + [TypedEmitter, "TypedEmitter"], + [EventEmitter3, "EventEmitter3"], +]) { + const emitter = new EventEmitter(); + + emitter.on("hello", event => { + event.preventDefault(); + }); + + bench(`${className}.emit`, () => { + emitter.emit("hello", { + preventDefault() { + id++; + }, + }); + }); + + bench(`${className}.on x 10_000 (handler)`, () => { + var cb = event => { + event.preventDefault(); + }; + emitter.on("hey", cb); + var called = false; + for (let i = 0; i < 10_000; i++) + emitter.emit("hey", { + preventDefault() { + id++; + called = true; + }, + }); + emitter.off("hey", cb); + + if (!called) throw new Error("not called"); + }); + + if (EventEmitter !== EventEmitter3) { + var monkey = Object.assign({}, EventEmitter.prototype); + monkey.on("hello", event => { + event.preventDefault(); + }); + + bench(`[monkey] ${className}.emit`, () => { + var called = false; + monkey.emit("hello", { + preventDefault() { + id++; + called = true; + }, + }); + + if (!called) { + throw new Error("monkey failed"); + } + }); + + bench(`[monkey] ${className}.on x 10_000 (handler)`, () => { + var cb = () => { + event.preventDefault(); + }; + monkey.on("hey", cb); + for (let i = 0; i < 10_000; i++) + monkey.emit("hey", { + preventDefault() { + id++; + }, + }); + monkey.off("hey", cb); + }); + } +} + +var target = new EventTarget(); +target.addEventListener("hello", event => {}); +bench("EventTarget.dispatch", () => { + target.dispatchEvent(event); +}); + +var hey = new Event("hey"); + +bench("EventTarget.on x 10_000 (handler)", () => { + var handler = event => {}; + target.addEventListener("hey", handler); + + for (let i = 0; i < 10_000; i++) target.dispatchEvent(hey); + target.removeEventListener("hey", handler); +}); + +await run(); diff --git a/bench/snippets/package.json b/bench/snippets/package.json new file mode 100644 index 000000000..6244001a8 --- /dev/null +++ b/bench/snippets/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "eventemitter3": "^5.0.0", + "tiny-typed-emitter": "latest" + }, + "prettier": "../../.prettierrc.cjs" +} |