diff --git a/bench/mod.ts b/bench/mod.ts index ca9de34..cf98ae3 100644 --- a/bench/mod.ts +++ b/bench/mod.ts @@ -1,3 +1,4 @@ import "./input.bench.ts"; import "./render.bench.ts"; import "./ops.bench.ts"; +import "./startup.bench.ts"; diff --git a/bench/startup.bench.ts b/bench/startup.bench.ts new file mode 100644 index 0000000..8f532c6 --- /dev/null +++ b/bench/startup.bench.ts @@ -0,0 +1,51 @@ +import { Bench } from "tinybench"; +import { withCodSpeed } from "@codspeed/tinybench-plugin"; +import { bytes, compiled } from "../wasm.ts"; +import { createTermNative } from "../term-native.ts"; +import { createInputNative } from "../input-native.ts"; +import { createTerm } from "../term.ts"; +import { close, grow, open, text } from "../ops.ts"; +import type { Op } from "../ops.ts"; + +const helloOps: Op[] = [ + open("root", { layout: { width: grow(), height: grow(), direction: "ttb" } }), + text("Hello, World!"), + close(), +]; + +let bench = withCodSpeed(new Bench()); + +bench + .add("wasm compile", async () => { + await WebAssembly.compile(bytes); + }) + .add("wasm instantiate", async () => { + const memory = new WebAssembly.Memory({ initial: 2 }); + await WebAssembly.instantiate(compiled, { + env: { memory }, + clay: { + measureTextFunction() {}, + queryScrollOffsetFunction(ret: number) { + const v = new DataView(memory.buffer); + v.setFloat32(ret, 0, true); + v.setFloat32(ret + 4, 0, true); + }, + }, + }); + }) + .add("createTermNative (80x24)", async () => { + await createTermNative(80, 24); + }) + .add("createInputNative", async () => { + await createInputNative(50); + }) + .add("createTerm (80x24)", async () => { + await createTerm({ width: 80, height: 24 }); + }) + .add("startup: createTerm + first render (80x24)", async () => { + const term = await createTerm({ width: 80, height: 24 }); + term.render(helloOps); + }); + +await bench.run(); +console.table(bench.table()); diff --git a/tasks/bundle-wasm.ts b/tasks/bundle-wasm.ts index b6b033d..662c108 100644 --- a/tasks/bundle-wasm.ts +++ b/tasks/bundle-wasm.ts @@ -4,7 +4,7 @@ const wasm = await Deno.readFile("clayterm.wasm"); const base64 = encodeBase64(wasm); const source = `const bin = atob("${base64}"); -const bytes = new Uint8Array(bin.length); +export const bytes = new Uint8Array(bin.length); for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i); export const compiled = await WebAssembly.compile(bytes); `;