Skip to content

dsp

Minified1.43 KBMinzipped593 B

Small & fast disposables.

Example

ts
import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();
const dspB = Dsp.create();

Dsp.add(dspA, () => console.log(1));
Dsp.add(dspA, () => console.log(2));
Dsp.add(dspB, () => console.log(3));
Dsp.add(dspB, () => console.log(4));
Dsp.add(dspA, dspB);

Dsp.dispose(dspA); // Prints: 4, 3, 2, 1

Installation

sh
npm install @monstermann/dsp
sh
pnpm add @monstermann/dsp
sh
yarn add @monstermann/dsp
sh
bun add @monstermann/dsp

Benchmarks

Apple M1 Max, Node v24.0.1

bench-dispose-cbs

  • Setup: Create a disposable with N callbacks attached
  • Bench: Dispose above
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 133M23ns±0.07%43M
Dsp.dispose(dsp) x 1024M40ns±0.11%25M
Dsp.dispose(dsp) x 1004M237ns±0.07%4M
DisposableStack.dispose() x 122M51ns±0.07%20M
DisposableStack.dispose() x 104M245ns±0.07%4M
DisposableStack.dispose() x 100468K2µs±0.10%463K

bench-dispose-dsps-wide

  • Setup: Create a disposable with N other disposables attached
  • Bench: Dispose above
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 127M30ns±0.07%34M
Dsp.dispose(dsp) x 109M118ns±0.11%8M
Dsp.dispose(dsp) x 100986K1µs±4.23%877K
DisposableStack.dispose() x 112M83ns±0.07%12M
DisposableStack.dispose() x 102M569ns±0.08%2M
DisposableStack.dispose() x 100188K5µs±0.09%186K

bench-dispose-dsps-deep

  • Setup: Create a disposable with N other disposables attached, arranged as a chain
  • Bench: Dispose above
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 129M26ns±0.08%38M
Dsp.dispose(dsp) x 107M156ns±0.24%6M
Dsp.dispose(dsp) x 100682K2µs±3.65%634K
DisposableStack.dispose() x 113M83ns±0.07%12M
DisposableStack.dispose() x 101M783ns±0.07%1M
DisposableStack.dispose() x 100110K9µs±0.09%109K

bench-dispose-dsps-wide-reverse

  • Setup: Create a disposable with N other disposables attached
  • Bench: Dispose above in reverse order, one by one
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 129M26ns±0.08%38M
Dsp.dispose(dsp) x 107M155ns±1.19%6M
Dsp.dispose(dsp) x 100767K1µs±0.10%756K
DisposableStack.dispose() x 120M55ns±0.08%18M
DisposableStack.dispose() x 103M370ns±0.05%3M
DisposableStack.dispose() x 100294K3µs±0.05%293K

bench-dispose-dsps-deep-reverse

  • Setup: Create a disposable with N other disposables attached, arranged as a chain
  • Bench: Dispose above in reverse order, one by one
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 124M40ns±0.04%25M
Dsp.dispose(dsp) x 105M223ns±0.06%4M
Dsp.dispose(dsp) x 100471K2µs±2.48%462K
DisposableStack.dispose() x 111M93ns±0.31%11M
DisposableStack.dispose() x 101M841ns±0.05%1M
DisposableStack.dispose() x 100103K10µs±0.06%103K
  • Setup: Create a disposable
  • Bench: Attach N callbacks to it
nameops/sectime/opmarginsamples
Dsp.add(dsp, callback) x 134M22ns±0.06%45M
Dsp.add(dsp, callback) x 1002M768ns±6.35%1M
Dsp.add(dsp, callback) x 1000158K7µs±1.56%137K
DisposableStack.adopt(undefined, callback) x 124M43ns±0.28%23M
DisposableStack.adopt(undefined, callback) x 100496K2µs±6.78%451K
DisposableStack.adopt(undefined, callback) x 100046K23µs±0.75%44K
  • Setup: Create a disposable
  • Bench: Attach N other disposables to it
nameops/sectime/opmarginsamples
Dsp.add(dsp, Dsp.create()) x 134M22ns±0.07%45M
Dsp.add(dsp, Dsp.create()) x 1002M762ns±7.31%1M
Dsp.add(dsp, Dsp.create()) x 1000162K7µs±2.75%137K
DisposableStack.use(new DisposableStack()) x 111M91ns±0.06%11M
DisposableStack.use(new DisposableStack()) x 100151K7µs±6.90%142K
DisposableStack.use(new DisposableStack()) x 100015K68µs±0.61%15K

bench-create

  • Bench: Creates N empty disposables
nameops/sectime/opmarginsamples
Dsp.create() x 136M21ns±0.08%48M
Dsp.create() x 10024M41ns±0.85%24M
Dsp.create() x 10003M340ns±0.07%3M
new DisposableStack() x 122M51ns±5.95%20M
new DisposableStack() x 100359K3µs±8.03%332K
new DisposableStack() x 100036K28µs±0.40%36K

memory

Heapsize for 1M instances:

  • Dsp.create(): 247.57 MB
  • new DisposableStack(): 299.39 MB

Tree-shaking

Installation

sh
npm install -D @monstermann/unplugin-dsp
sh
pnpm -D add @monstermann/unplugin-dsp
sh
yarn -D add @monstermann/unplugin-dsp
sh
bun -D add @monstermann/unplugin-dsp

Usage

ts
// vite.config.ts
import dsp from "@monstermann/unplugin-dsp/vite";

export default defineConfig({
    plugins: [dsp()],
});
ts
// rollup.config.js
import dsp from "@monstermann/unplugin-dsp/rollup";

export default {
    plugins: [dsp()],
};
ts
// rolldown.config.js
import dsp from "@monstermann/unplugin-dsp/rolldown";

export default {
    plugins: [dsp()],
};
ts
// webpack.config.js
const dsp = require("@monstermann/unplugin-dsp/webpack");

module.exports = {
    plugins: [dsp()],
};
ts
// rspack.config.js
const dsp = require("@monstermann/unplugin-dsp/rspack");

module.exports = {
    plugins: [dsp()],
};
ts
// esbuild.config.js
import { build } from "esbuild";
import dsp from "@monstermann/unplugin-dsp/esbuild";

build({
    plugins: [dsp()],
});