From baa6193211187305bf2e030259c5b30cbca39532 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Sat, 30 May 2026 04:35:22 -0500 Subject: [PATCH] ref(bench): spawn fixture --- .github/workflows/benchmark.yml | 40 +++++++++++++++++++++++++--- bench/fixtures/create-term/mod.ts | 3 +++ bench/fixtures/render-minimal/mod.ts | 9 +++++++ bench/fixtures/utils.ts | 9 +++++++ bench/startup.bench.ts | 12 +++++++++ bench/startup/createTerm.bench.ts | 14 ---------- bench/startup/ttfr.bench.ts | 20 -------------- 7 files changed, 69 insertions(+), 38 deletions(-) create mode 100644 bench/fixtures/create-term/mod.ts create mode 100644 bench/fixtures/render-minimal/mod.ts create mode 100644 bench/fixtures/utils.ts create mode 100644 bench/startup.bench.ts delete mode 100644 bench/startup/createTerm.bench.ts delete mode 100644 bench/startup/ttfr.bench.ts diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 0b9e7c4..7ec8502 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -50,7 +50,39 @@ jobs: with: mode: simulation # IMPORTANT! deno task bench fails in CI due to incompatible V8 bindings - run: | - node bench/mod.ts - node bench/startup/createTerm.bench.ts - node bench/startup/ttfr.bench.ts + run: node bench/mod.ts + + startup-process-benchmarks: + name: Run process startup benchmarks + runs-on: codspeed-macro + permissions: + contents: read + id-token: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Build WASM + run: make + + - name: Install dependencies + run: deno install + + - name: Run process startup benchmarks + uses: CodSpeedHQ/action@v4 + with: + mode: walltime + run: node bench/startup.bench.ts diff --git a/bench/fixtures/create-term/mod.ts b/bench/fixtures/create-term/mod.ts new file mode 100644 index 0000000..b391f21 --- /dev/null +++ b/bench/fixtures/create-term/mod.ts @@ -0,0 +1,3 @@ +import { createTerm } from "../../../term.ts"; + +await createTerm({ width: 80, height: 24 }); diff --git a/bench/fixtures/render-minimal/mod.ts b/bench/fixtures/render-minimal/mod.ts new file mode 100644 index 0000000..6430785 --- /dev/null +++ b/bench/fixtures/render-minimal/mod.ts @@ -0,0 +1,9 @@ +import { createTerm } from "../../../term.ts"; +import { close, grow, open, text } from "../../../ops.ts"; + +let term = await createTerm({ width: 80, height: 24 }); +term.render([ + open("root", { layout: { width: grow(), height: grow(), direction: "ttb" } }), + text("Hello, World!"), + close(), +]); diff --git a/bench/fixtures/utils.ts b/bench/fixtures/utils.ts new file mode 100644 index 0000000..85014b6 --- /dev/null +++ b/bench/fixtures/utils.ts @@ -0,0 +1,9 @@ +import { fileURLToPath } from "node:url"; +import { spawnSync } from "node:child_process"; + +export const fixture = (name: string) => { + return new URL(`./${name}/mod.ts`, import.meta.url); +} + +export const spawnFixture = (name: string) => + spawnSync(process.execPath, [...process.execArgv, fileURLToPath(fixture(name))], { stdio: "ignore" }); diff --git a/bench/startup.bench.ts b/bench/startup.bench.ts new file mode 100644 index 0000000..679b8e1 --- /dev/null +++ b/bench/startup.bench.ts @@ -0,0 +1,12 @@ +import { Bench } from "tinybench"; +import { withCodSpeed } from "@codspeed/tinybench-plugin"; +import { spawnFixture } from './fixtures/utils.ts'; + +let bench = withCodSpeed(new Bench({ name: "startup" })); + +bench + .add("createTerm", () => spawnFixture('create-term')) + .add("time to first render", () => spawnFixture('render-minimal')); + +await bench.run(); +console.table(bench.table()); diff --git a/bench/startup/createTerm.bench.ts b/bench/startup/createTerm.bench.ts deleted file mode 100644 index ea431c6..0000000 --- a/bench/startup/createTerm.bench.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Bench } from "tinybench"; -import { withCodSpeed } from "@codspeed/tinybench-plugin"; -import { createTerm } from "../../term.ts"; - -let bench = withCodSpeed(new Bench({ name: 'startup', })); - -bench - .add("createTerm", async () => { - await createTerm({ width: 80, height: 24 }); - }); - -await bench.run(); -console.table(bench.table()); - diff --git a/bench/startup/ttfr.bench.ts b/bench/startup/ttfr.bench.ts deleted file mode 100644 index 2c5abb9..0000000 --- a/bench/startup/ttfr.bench.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Bench } from "tinybench"; -import { withCodSpeed } from "@codspeed/tinybench-plugin"; -import { createTerm } from "../../term.ts"; -import { close, grow, open, text } from "../../ops.ts"; - -let bench = withCodSpeed(new Bench({ name: 'startup' })); - -bench - .add("time to first render", async () => { - let term = await createTerm({ width: 80, height: 24 }); - term.render([ - open("root", { layout: { width: grow(), height: grow(), direction: "ttb" } }), - text("Hello, World!"), - close(), - ]); - }); - -await bench.run(); -console.table(bench.table()); - -- 2.51.2