// DSLValueGraph measure hotpath (async retrieval for authorization checks). import { performance } from 'node:perf_hooks'; import { DSLRuntime, DSLValueGraph } from '../src/index.js'; import { Arbiter } from '@arbiter/core'; const rt = new DSLRuntime(new Arbiter()).compile('measure budget(user: string) { } PROVIDES number', 'bench'); const dvg = new DSLValueGraph(rt); dvg.attach(); dvg.setValue('budget', { __subject: 'u:1', user: 'u:1' }, 1250); async function measureCached() { return dvg.measure('budget', { __subject: 'u:1', user: 'u:1' }); } await measureCached(); // warm let t0 = performance.now(); let N = 20_000; for (let i = 0; i < N; i++) await measureCached(); console.log(`dvg.measure cached (async) ${(((performance.now() - t0) / N) * 1e6).toFixed(0).padStart(8)} ns/op ${Math.round(N / ((performance.now() - t0) / 1000)).toLocaleString()} ops/sec`); // cold: a fresh measure with an external resolver computing on the fly const cold = new DSLValueGraph(new DSLRuntime(new Arbiter()).compile('measure b(user: string) { } PROVIDES number', 'b')); cold.resolve('b', (s) => 99); async function measureCold() { return cold.measure('b', { __subject: 'u:1', user: 'u:1' }); } await measureCold(); t0 = performance.now(); N = 20_000; for (let i = 0; i < N; i++) await measureCold(); console.log(`dvg.measure cold (resolver) ${(((performance.now() - t0) / N) * 1e6).toFixed(0).padStart(8)} ns/op`);