Skip to content

hazae41/deimos

Repository files navigation

Modern and minimalist benchmarking library

npm i @hazae41/deimos

Node Package 📦

src/node/bench/xor_mod.bench.ts
cpu: Apple M1 Max
runtime: node v18.12.1 (arm64-darwin)

┌─────────┬──────────────────┬─────────────┬─────────────┐
│ (index) │     average      │   minimum   │   maximum   │
├─────────┼──────────────────┼─────────────┼─────────────┤
│  wasm   │ '880.48 ns/iter' │ '750.00 ns' │ '154.00 μs' │
│   js    │ '17.71 μs/iter'  │ '17.42 μs'  │ '610.67 μs' │
└─────────┴──────────────────┴─────────────┴─────────────┘

Summary
- wasm is 20.11x faster than js

Philosophy 🧠

Deimos aims to be minimalist and to always work no matter the:

  • runtime (Node, Deno, browser)
  • module resolution (ESM, CommonJS)
  • language (TypeScript, JavaScript)
  • bundler (Rollup, Vite)

It's just a library you can import everywhere! That's it, no CLI, no configuration file, just JavaScript.

Features 🔥

Current features

  • 100% TypeScript and ESM
  • No external dependency
  • Runnable in the browser

Usage 🚀

import { bench } from "@hazae41/deimos"

const a = await bench("my library", async () => {
  await compute()
})

const b = await bench("some other library", async () => {
  await compute2()
})

console.log(`${a.message} is ${a.ratio(b)} times faster than ${b.message}`)
ts-node --esm ./bench.ts

Setting up 🔧

Most setups will just need a custom entry point that imports all your benchs, that you either run as-is using ts-node, or that you transpile using your favorite bundler.

For example, the entry point index.bench.ts imports:

  • some-module/index.bench.ts, which imports:
    • some-module/some-file.bench.ts
    • some-module/some-other-file.bench.ts
  • some-other-module/index.bench.ts, which imports:
    • some-other-module/some-file.bench.ts
    • some-other-module/some-other-file.bench.ts

You can see an example on this repository, all benchs are imported in src/index.bench.ts, then we use Rollup to transpile it into dist/test/index.bench.cjs, which we then run using Node with node ./dist/test/index.bench.cjs.

Running 🏎️

Using a bundler

node ./dist/test/index.bench.cjs

Using ts-node with ESM

ts-node --esm ./src/index.bench.ts

Using ts-node with ESM and ttypescript

ts-node --esm --compiler ttypescript ./src/index.bench.ts

Using dynamic import

await import("index.bench.ts")