diff --git a/bench/tunes.bench.mjs b/bench/tunes.bench.mjs
new file mode 100644
index 00000000..cd381873
--- /dev/null
+++ b/bench/tunes.bench.mjs
@@ -0,0 +1,22 @@
+import { queryCode, testCycles } from '../test/runtime.mjs';
+import * as tunes from '../website/src/repl/tunes.mjs';
+import { describe, bench } from 'vitest';
+import { calculateTactus } from '../packages/core/index.mjs';
+
+const tuneKeys = Object.keys(tunes);
+
+describe('renders tunes', () => {
+ tuneKeys.forEach((key) => {
+ describe(key, () => {
+ calculateTactus(true);
+ bench(`+tactus`, async () => {
+ await queryCode(tunes[key], testCycles[key] || 1);
+ });
+ calculateTactus(false);
+ bench(`-tactus`, async () => {
+ await queryCode(tunes[key], testCycles[key] || 1);
+ });
+ calculateTactus(true);
+ });
+ });
+});
diff --git a/package.json b/package.json
index 97900913..8aefa102 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
"test": "npm run pretest && vitest run --version",
"test-ui": "npm run pretest && vitest --ui",
"test-coverage": "npm run pretest && vitest --coverage",
+ "bench": "npm run pretest && vitest bench",
"snapshot": "npm run pretest && vitest run -u --silent",
"repl": "npm run prestart && cd website && npm run dev",
"start": "npm run prestart && cd website && npm run dev",
diff --git a/packages/core/bench/pattern.bench.mjs b/packages/core/bench/pattern.bench.mjs
new file mode 100644
index 00000000..12644800
--- /dev/null
+++ b/packages/core/bench/pattern.bench.mjs
@@ -0,0 +1,46 @@
+import { describe, bench } from 'vitest';
+
+import { calculateTactus, sequence, stack } from '../index.mjs';
+
+const pat64 = sequence(...Array(64).keys());
+
+describe('tactus', () => {
+ calculateTactus(true);
+ bench(
+ '+tactus',
+ () => {
+ pat64.iter(64).fast(64).firstCycle();
+ },
+ { time: 1000 },
+ );
+
+ calculateTactus(false);
+ bench(
+ '-tactus',
+ () => {
+ pat64.iter(64).fast(64).firstCycle();
+ },
+ { time: 1000 },
+ );
+});
+
+describe('stack', () => {
+ calculateTactus(true);
+ bench(
+ '+tactus',
+ () => {
+ stack(pat64, pat64, pat64, pat64, pat64, pat64, pat64, pat64).fast(64).firstCycle();
+ },
+ { time: 1000 },
+ );
+
+ calculateTactus(false);
+ bench(
+ '-tactus',
+ () => {
+ stack(pat64, pat64, pat64, pat64, pat64, pat64, pat64, pat64).fast(64).firstCycle();
+ },
+ { time: 1000 },
+ );
+});
+calculateTactus(true);
diff --git a/packages/core/package.json b/packages/core/package.json
index 7f59ed41..6c95d049 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -9,6 +9,7 @@
},
"scripts": {
"test": "vitest run",
+ "bench": "vitest bench",
"build": "vite build",
"prepublishOnly": "pnpm build"
},
diff --git a/packages/mini/bench/mini.bench.mjs b/packages/mini/bench/mini.bench.mjs
new file mode 100644
index 00000000..782ac86b
--- /dev/null
+++ b/packages/mini/bench/mini.bench.mjs
@@ -0,0 +1,25 @@
+import { describe, bench } from 'vitest';
+
+import { calculateTactus } from '../../core/index.mjs';
+import { mini } from '../index.mjs';
+
+describe('mini', () => {
+ calculateTactus(true);
+ bench(
+ '+tactus',
+ () => {
+ mini('a b c*3 [c d e, f g] ').fast(64).firstCycle();
+ },
+ { time: 1000 },
+ );
+
+ calculateTactus(false);
+ bench(
+ '-tactus',
+ () => {
+ mini('a b c*3 [c d e, f g] ').fast(64).firstCycle();
+ },
+ { time: 1000 },
+ );
+ calculateTactus(true);
+});
diff --git a/packages/mini/package.json b/packages/mini/package.json
index cb4f459c..7bd73011 100644
--- a/packages/mini/package.json
+++ b/packages/mini/package.json
@@ -9,6 +9,7 @@
},
"scripts": {
"test": "vitest run",
+ "bench": "vitest bench",
"build:parser": "peggy -o krill-parser.js --format es ./krill.pegjs",
"build": "vite build",
"prepublishOnly": "npm run build"