diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-12-06 16:07:11 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-06 16:07:11 +0000 |
| commit | 6180c6622c88ca33d0d387a50be9036429281598 (patch) | |
| tree | 1df3e4143a489ada2f542896bf2f2ae392a727ca /packages/benchmarks/src/index.ts | |
| parent | de98873a06a25084eb2d3bcabda158f23c081672 (diff) | |
| download | karakeep-6180c6622c88ca33d0d387a50be9036429281598.tar.zst | |
chore: add benchmarks (#2229)
* chore: add benchmarks
* upgrade deps
* fixes
* lint
Diffstat (limited to 'packages/benchmarks/src/index.ts')
| -rw-r--r-- | packages/benchmarks/src/index.ts | 88 |
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(); |
