28 lines
1.2 KiB
JavaScript
28 lines
1.2 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { performance } from 'node:perf_hooks';
|
|
// Deterministic broadcast/access-check simulation. Not a live WebSocket/DB benchmark.
|
|
const durationSeconds = 10;
|
|
const editsPerUserPerSecond = 2;
|
|
for (const users of [5, 100, 300, 500]) {
|
|
const checks = new Int32Array(users);
|
|
const lastCheckSecond = new Int32Array(users).fill(-1);
|
|
const start = performance.now();
|
|
let fanouts = 0;
|
|
for (let second = 0; second < durationSeconds; second++) {
|
|
for (let event = 0; event < users * editsPerUserPerSecond; event++) {
|
|
for (let recipient = 0; recipient < users; recipient++) {
|
|
fanouts++;
|
|
if (lastCheckSecond[recipient] !== second) {
|
|
checks[recipient]++;
|
|
lastCheckSecond[recipient] = second;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const optimized = checks.reduce((a,b) => a+b, 0);
|
|
const baseline = fanouts;
|
|
assert.equal(optimized, users * durationSeconds);
|
|
assert.ok(optimized <= baseline);
|
|
console.log(`${users} clients | ${fanouts.toLocaleString('en-US')} broadcast deliveries | auth reads: ${baseline.toLocaleString('en-US')} -> ${optimized.toLocaleString('en-US')} | reduction ${(100*(1-optimized/baseline)).toFixed(2)}% | simulation ${(performance.now()-start).toFixed(1)} ms`);
|
|
}
|