aboutsummaryrefslogtreecommitdiffstats
path: root/packages/benchmarks/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/benchmarks/src/index.ts')
-rw-r--r--packages/benchmarks/src/index.ts88
1 files changed, 88 insertions, 0 deletions
diff --git a/packages/benchmarks/src/index.ts b/packages/benchmarks/src/index.ts
new file mode 100644
index 00000000..9633da6e
--- /dev/null
+++ b/packages/benchmarks/src/index.ts
@@ -0,0 +1,88 @@
+import { runBenchmarks } from "./benchmarks";
+import { logInfo, logStep, logSuccess, logWarn } from "./log";
+import { seedData } from "./seed";
+import { startContainers } from "./startContainers";
+
+interface CliConfig {
+ bookmarkCount: number;
+ tagCount: number;
+ listCount: number;
+ concurrency: number;
+ keepContainers: boolean;
+ timeMs: number;
+ warmupMs: number;
+}
+
+function numberFromEnv(key: string, fallback: number): number {
+ const raw = process.env[key];
+ if (!raw) return fallback;
+ const parsed = Number(raw);
+ return Number.isFinite(parsed) ? parsed : fallback;
+}
+
+function loadConfig(): CliConfig {
+ return {
+ bookmarkCount: numberFromEnv("BENCH_BOOKMARKS", 400),
+ tagCount: numberFromEnv("BENCH_TAGS", 25),
+ listCount: numberFromEnv("BENCH_LISTS", 6),
+ concurrency: numberFromEnv("BENCH_SEED_CONCURRENCY", 12),
+ keepContainers: process.env.BENCH_KEEP_CONTAINERS === "1",
+ timeMs: numberFromEnv("BENCH_TIME_MS", 1000),
+ warmupMs: numberFromEnv("BENCH_WARMUP_MS", 300),
+ };
+}
+
+async function main() {
+ const config = loadConfig();
+
+ logStep("Benchmark configuration");
+ logInfo(`Bookmarks: ${config.bookmarkCount}`);
+ logInfo(`Tags: ${config.tagCount}`);
+ logInfo(`Lists: ${config.listCount}`);
+ logInfo(`Seed concur.: ${config.concurrency}`);
+ logInfo(`Time per case:${config.timeMs}ms (warmup ${config.warmupMs}ms)`);
+ logInfo(`Keep containers after run: ${config.keepContainers ? "yes" : "no"}`);
+
+ const running = await startContainers();
+
+ const stopContainers = async () => {
+ if (config.keepContainers) {
+ logWarn(
+ `Skipping docker compose shutdown (BENCH_KEEP_CONTAINERS=1). Port ${running.port} stays up.`,
+ );
+ return;
+ }
+ await running.stop();
+ };
+
+ const handleSignal = async (signal: NodeJS.Signals) => {
+ logWarn(`Received ${signal}, shutting down...`);
+ await stopContainers();
+ process.exit(1);
+ };
+
+ process.on("SIGINT", handleSignal);
+ process.on("SIGTERM", handleSignal);
+
+ try {
+ const seedResult = await seedData({
+ bookmarkCount: config.bookmarkCount,
+ tagCount: config.tagCount,
+ listCount: config.listCount,
+ concurrency: config.concurrency,
+ });
+
+ await runBenchmarks(seedResult, {
+ timeMs: config.timeMs,
+ warmupMs: config.warmupMs,
+ });
+ logSuccess("All done");
+ } catch (error) {
+ logWarn("Benchmark run failed");
+ console.error(error);
+ } finally {
+ await stopContainers();
+ }
+}
+
+main();