import { bench, describe } from 'vitest' import type { KVChange } from '../src/kv-storage/base-kv-storage.js' import { KVStorageInMemory } from '../src/kv-storage/kv-storage-in-memory.js' for (const n of [10_000, 100_000]) { const db = new KVStorageInMemory() await db.writeMany(Array.from({ length: n }, (_, i) => ({ key: `users/u${i}`, value: { name: `user ${i}`, n: i } }))) const users = db.child('users') const keys = Array.from({ length: 100 }, (_, i) => `u${(i * 7919) % n}`) let i = 0 describe(`KV @ ${n / 1000}k keys`, () => { bench('get', async () => { await users.get(`u${i++ % n}`) }) bench('set', async () => { await users.set(`u${i++ % n}`, { name: 'x', n: i }) }) bench('getMany x100', async () => { await users.getMany(keys) }) }) } const tree = new KVStorageInMemory() const writes: KVChange[] = [] for (let c = 0; c < 1000; c++) { writes.push({ key: `n/c${c}`, value: c }) for (let d = 0; d < 100; d++) writes.push({ key: `n/c${c}/d${d}`, value: d }) } await tree.writeMany(writes) describe('keys() on 1k children x 100 descendants', () => { bench('keys() skip-scan', async () => { for await (const _ of tree.child('n').keys()) { } }) bench('full subtree scan (reference)', async () => { for await (const _ of tree.scan({ gte: 'n/', lt: 'n0' })) { } }) })