From 7a157371078d7604e4b6efa1ccc7fa4e82dcaae7 Mon Sep 17 00:00:00 2001 From: Steffen Beyer Date: Thu, 19 Mar 2026 00:36:26 +0100 Subject: [PATCH] bench: Fix render --- bench/chart.svg | 237 ++++++++++++++++++++++++++++++++---- bench/history.jsonl | 2 +- scripts/run_bench_update.sh | 30 ++++- 3 files changed, 239 insertions(+), 30 deletions(-) diff --git a/bench/chart.svg b/bench/chart.svg index f993cdf..81df9e4 100644 --- a/bench/chart.svg +++ b/bench/chart.svg @@ -150,8 +150,28 @@ 4000 + + + v0.2.0 + + + + + v0.3.0 + + + v0.4.0 + + + + + v0.5.0 + + + + v0.6.0 @@ -170,7 +190,11 @@ - + + + + + @@ -181,7 +205,11 @@ - + + + + + @@ -194,7 +222,11 @@ - + + + + + @@ -205,7 +237,11 @@ - + + + + + @@ -333,8 +369,28 @@ 7000 + + + v0.2.0 + + + + + v0.3.0 + + + v0.4.0 + + + + + v0.5.0 + + + + v0.6.0 @@ -353,7 +409,11 @@ - + + + + + @@ -364,7 +424,11 @@ - + + + + + @@ -377,7 +441,11 @@ - + + + + + @@ -388,7 +456,11 @@ - + + + + + @@ -516,8 +588,28 @@ 180000 + + + v0.2.0 + + + + + v0.3.0 + + + v0.4.0 + + + + + v0.5.0 + + + + v0.6.0 @@ -536,7 +628,11 @@ - + + + + + @@ -547,7 +643,11 @@ - + + + + + @@ -560,7 +660,11 @@ - + + + + + @@ -571,7 +675,11 @@ - + + + + + @@ -613,11 +721,11 @@ - + - + 5 @@ -625,13 +733,26 @@ + + + + + + + 10 + + + + + + - 10 + 15 @@ -639,12 +760,25 @@ - + - - 15 + + 20 + + + + + + + + + + + + + 25 @@ -657,7 +791,7 @@ - 20 + 30 @@ -665,12 +799,25 @@ - + - - 25 + + 35 + + + + + + + + + + + + + 40 @@ -683,11 +830,31 @@ - 30 + 45 + + + + + v0.2.0 + + + + + v0.3.0 + v0.4.0 + + + + + v0.5.0 + + + + v0.6.0 @@ -706,7 +873,11 @@ - + + + + + @@ -717,7 +888,11 @@ - + + + + + @@ -730,7 +905,11 @@ - + + + + + @@ -741,7 +920,11 @@ - + + + + + diff --git a/bench/history.jsonl b/bench/history.jsonl index 7182523..77c9cdf 100644 --- a/bench/history.jsonl +++ b/bench/history.jsonl @@ -1,5 +1,5 @@ -{"timestamp":"2026-03-18T21:35:03Z","machine_id":"agent","git_tag":"v0.6.0","git_commit":"7b337d9","runs":3,"versions":{"parrhesia":"0.6.0","strfry":"strfry 1.0.4 (nixpkgs)","nostr-rs-relay":"nostr-rs-relay 0.9.0","nostr-bench":"nostr-bench 0.4.0"},"servers":{"parrhesia-pg":{"connect_avg_ms":26.666666666666668,"connect_max_ms":45.333333333333336,"echo_tps":68100.33333333333,"echo_mibs":37.233333333333334,"event_tps":1647.3333333333333,"event_mibs":1.0666666666666667,"req_tps":3576.6666666666665,"req_mibs":18.833333333333332},"parrhesia-memory":{"connect_avg_ms":14.666666666666666,"connect_max_ms":24.333333333333332,"echo_tps":55978,"echo_mibs":30.633333333333336,"event_tps":882,"event_mibs":0.5666666666666668,"req_tps":6888,"req_mibs":36.06666666666666},"strfry":{"connect_avg_ms":3,"connect_max_ms":4.666666666666667,"echo_tps":67718.33333333333,"echo_mibs":37.86666666666667,"event_tps":3548.3333333333335,"event_mibs":2.3,"req_tps":1808,"req_mibs":11.699999999999998},"nostr-rs-relay":{"connect_avg_ms":2,"connect_max_ms":3.3333333333333335,"echo_tps":166178,"echo_mibs":91.03333333333335,"event_tps":787,"event_mibs":0.5,"req_tps":860.6666666666666,"req_mibs":2.4}}} {"timestamp":"2026-03-18T22:14:37Z","machine_id":"agent","git_tag":"v0.2.0","git_commit":"b20dbf6","runs":3,"versions":{"parrhesia":"0.2.0","strfry":"strfry 1.0.4 (nixpkgs)","nostr-rs-relay":"nostr-rs-relay 0.9.0","nostr-bench":"nostr-bench 0.4.0"},"servers":{"parrhesia-pg":{"connect_avg_ms":14.666666666666666,"connect_max_ms":25.666666666666668,"echo_tps":77133,"echo_mibs":42.233333333333334,"event_tps":1602.6666666666667,"event_mibs":1.0666666666666667,"req_tps":2418,"req_mibs":12.5},"parrhesia-memory":{"connect_avg_ms":9,"connect_max_ms":16,"echo_tps":64218.333333333336,"echo_mibs":35.166666666666664,"event_tps":1578.3333333333333,"event_mibs":1,"req_tps":2431.3333333333335,"req_mibs":12.633333333333333},"strfry":{"connect_avg_ms":3.3333333333333335,"connect_max_ms":6,"echo_tps":63682.666666666664,"echo_mibs":35.6,"event_tps":3477.3333333333335,"event_mibs":2.2333333333333334,"req_tps":1804,"req_mibs":11.733333333333334},"nostr-rs-relay":{"connect_avg_ms":2.6666666666666665,"connect_max_ms":4.333333333333333,"echo_tps":160009,"echo_mibs":87.63333333333333,"event_tps":762,"event_mibs":0.4666666666666666,"req_tps":831,"req_mibs":2.2333333333333334}}} {"timestamp":"2026-03-18T22:22:12Z","machine_id":"agent","git_tag":"v0.3.0","git_commit":"8c8d5a8","runs":3,"versions":{"parrhesia":"0.3.0","strfry":"strfry 1.0.4 (nixpkgs)","nostr-rs-relay":"nostr-rs-relay 0.9.0","nostr-bench":"nostr-bench 0.4.0"},"servers":{"parrhesia-pg":{"connect_avg_ms":13,"connect_max_ms":21.666666666666668,"echo_tps":70703.33333333333,"echo_mibs":38.7,"event_tps":1970.6666666666667,"event_mibs":1.3,"req_tps":3614,"req_mibs":20.966666666666665},"parrhesia-memory":{"connect_avg_ms":13,"connect_max_ms":22.333333333333332,"echo_tps":60452.333333333336,"echo_mibs":33.1,"event_tps":1952.6666666666667,"event_mibs":1.3,"req_tps":3616,"req_mibs":20.766666666666666},"strfry":{"connect_avg_ms":3.6666666666666665,"connect_max_ms":6,"echo_tps":63128.666666666664,"echo_mibs":35.300000000000004,"event_tps":3442,"event_mibs":2.2333333333333334,"req_tps":1804,"req_mibs":11.699999999999998},"nostr-rs-relay":{"connect_avg_ms":2,"connect_max_ms":3.3333333333333335,"echo_tps":164995.33333333334,"echo_mibs":90.36666666666667,"event_tps":761.6666666666666,"event_mibs":0.5,"req_tps":846.3333333333334,"req_mibs":2.333333333333333}}} {"timestamp":"2026-03-18T22:30:08Z","machine_id":"agent","git_tag":"v0.4.0","git_commit":"b86b5db","runs":3,"versions":{"parrhesia":"0.4.0","strfry":"strfry 1.0.4 (nixpkgs)","nostr-rs-relay":"nostr-rs-relay 0.9.0","nostr-bench":"nostr-bench 0.4.0"},"servers":{"parrhesia-pg":{"connect_avg_ms":11.333333333333334,"connect_max_ms":20.666666666666668,"echo_tps":69139.33333333333,"echo_mibs":37.833333333333336,"event_tps":1938.6666666666667,"event_mibs":1.3,"req_tps":4619.666666666667,"req_mibs":26.266666666666666},"parrhesia-memory":{"connect_avg_ms":10,"connect_max_ms":17.333333333333332,"echo_tps":62715.333333333336,"echo_mibs":34.333333333333336,"event_tps":1573,"event_mibs":1.0333333333333334,"req_tps":4768,"req_mibs":23.733333333333334},"strfry":{"connect_avg_ms":3.3333333333333335,"connect_max_ms":6,"echo_tps":60956.666666666664,"echo_mibs":34.06666666666667,"event_tps":3380.6666666666665,"event_mibs":2.2,"req_tps":1820.3333333333333,"req_mibs":11.800000000000002},"nostr-rs-relay":{"connect_avg_ms":2.6666666666666665,"connect_max_ms":4.333333333333333,"echo_tps":161165.33333333334,"echo_mibs":88.26666666666665,"event_tps":768,"event_mibs":0.5,"req_tps":847.3333333333334,"req_mibs":2.3000000000000003}}} {"timestamp":"2026-03-18T22:36:37Z","machine_id":"agent","git_tag":"v0.5.0","git_commit":"e557eba","runs":3,"versions":{"parrhesia":"0.5.0","strfry":"strfry 1.0.4 (nixpkgs)","nostr-rs-relay":"nostr-rs-relay 0.9.0","nostr-bench":"nostr-bench 0.4.0"},"servers":{"parrhesia-pg":{"connect_avg_ms":34.666666666666664,"connect_max_ms":61.666666666666664,"echo_tps":72441,"echo_mibs":39.666666666666664,"event_tps":1897.3333333333333,"event_mibs":1.2333333333333334,"req_tps":13.333333333333334,"req_mibs":0.03333333333333333},"parrhesia-memory":{"connect_avg_ms":43.333333333333336,"connect_max_ms":74.66666666666667,"echo_tps":62704.666666666664,"echo_mibs":34.300000000000004,"event_tps":1370,"event_mibs":0.8666666666666667,"req_tps":47,"req_mibs":0.16666666666666666},"strfry":{"connect_avg_ms":2.6666666666666665,"connect_max_ms":4.666666666666667,"echo_tps":61189.333333333336,"echo_mibs":34.2,"event_tps":3426.6666666666665,"event_mibs":2.2,"req_tps":1811.3333333333333,"req_mibs":11.766666666666666},"nostr-rs-relay":{"connect_avg_ms":2.6666666666666665,"connect_max_ms":4,"echo_tps":152654.33333333334,"echo_mibs":83.63333333333333,"event_tps":772.6666666666666,"event_mibs":0.5,"req_tps":878.3333333333334,"req_mibs":2.4}}} +{"timestamp":"2026-03-18T21:35:03Z","machine_id":"agent","git_tag":"v0.6.0","git_commit":"7b337d9","runs":3,"versions":{"parrhesia":"0.6.0","strfry":"strfry 1.0.4 (nixpkgs)","nostr-rs-relay":"nostr-rs-relay 0.9.0","nostr-bench":"nostr-bench 0.4.0"},"servers":{"parrhesia-pg":{"connect_avg_ms":26.666666666666668,"connect_max_ms":45.333333333333336,"echo_tps":68100.33333333333,"echo_mibs":37.233333333333334,"event_tps":1647.3333333333333,"event_mibs":1.0666666666666667,"req_tps":3576.6666666666665,"req_mibs":18.833333333333332},"parrhesia-memory":{"connect_avg_ms":14.666666666666666,"connect_max_ms":24.333333333333332,"echo_tps":55978,"echo_mibs":30.633333333333336,"event_tps":882,"event_mibs":0.5666666666666668,"req_tps":6888,"req_mibs":36.06666666666666},"strfry":{"connect_avg_ms":3,"connect_max_ms":4.666666666666667,"echo_tps":67718.33333333333,"echo_mibs":37.86666666666667,"event_tps":3548.3333333333335,"event_mibs":2.3,"req_tps":1808,"req_mibs":11.699999999999998},"nostr-rs-relay":{"connect_avg_ms":2,"connect_max_ms":3.3333333333333335,"echo_tps":166178,"echo_mibs":91.03333333333335,"event_tps":787,"event_mibs":0.5,"req_tps":860.6666666666666,"req_mibs":2.4}}} diff --git a/scripts/run_bench_update.sh b/scripts/run_bench_update.sh index 516a024..40e2e54 100755 --- a/scripts/run_bench_update.sh +++ b/scripts/run_bench_update.sh @@ -87,7 +87,8 @@ if (entries.length === 0) { process.exit(0); } -// Sort chronologically, deduplicate by tag (latest wins) +// Sort chronologically, deduplicate by tag (latest wins), +// then order the resulting series by git tag. entries.sort((a, b) => a.timestamp.localeCompare(b.timestamp)); const byTag = new Map(); for (const e of entries) { @@ -95,6 +96,22 @@ for (const e of entries) { } const deduped = [...byTag.values()]; +function parseSemverTag(tag) { + const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(tag); + return match ? match.slice(1).map(Number) : null; +} + +deduped.sort((a, b) => { + const aTag = parseSemverTag(a.git_tag); + const bTag = parseSemverTag(b.git_tag); + + if (aTag && bTag) { + return aTag[0] - bTag[0] || aTag[1] - bTag[1] || aTag[2] - bTag[2]; + } + + return a.git_tag.localeCompare(b.git_tag, undefined, { numeric: true }); +}); + // Determine which non-parrhesia servers are present const baselineServerNames = ["strfry", "nostr-rs-relay"]; const presentBaselines = baselineServerNames.filter(srv => @@ -215,13 +232,22 @@ const fs = require("node:fs"); const [, , entryJson, readmePath] = process.argv; const entry = JSON.parse(entryJson); -const { versions, ...servers } = entry; +const servers = entry.servers || {}; const pg = servers["parrhesia-pg"]; const mem = servers["parrhesia-memory"]; const strfry = servers["strfry"]; const nostrRs = servers["nostr-rs-relay"]; +if (!pg || !mem) { + const present = Object.keys(servers).sort().join(", ") || "(none)"; + console.error( + "Latest benchmark entry must include parrhesia-pg and parrhesia-memory. Present servers: " + + present + ); + process.exit(1); +} + function toFixed(v, d = 2) { return Number.isFinite(v) ? v.toFixed(d) : "n/a"; }