Skip to content

Commit da48984

Browse files
committed
Add multi-core scaling benchmark; fix stale spdlog finding claim
1 parent b3dcdb0 commit da48984

1 file changed

Lines changed: 42 additions & 8 deletions

File tree

README.md

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,48 @@ Measured on an 8-core Apple M3, Release build, average of 3 runs each,
177177
there being only 7 TUs to spread across the pool, not 8, plus thread-pool
178178
startup overhead. Peak RSS scales up correspondingly, since parallel runs
179179
keep multiple TUs' ASTs alive in memory at once instead of one at a time.
180-
Both modes report byte-for-byte identical findings (verified via `diff`),
181-
including the same real, pre-existing `redundant-move-return` case in
182-
spdlog's own `pattern_formatter-inl.h` found back in the M4 benchmark.
183-
184-
This is one honest number, not a benchmark suite -- see
185-
[`docs/spec.md`](docs/spec.md) §10/§14 for what's deliberately out of
186-
scope for the MVP (a benchmark corpus, scaling studies beyond this one
187-
data point).
180+
Both modes report byte-for-byte identical findings (verified via `diff`).
181+
(The M4 benchmark's real `redundant-move-return` finding in spdlog's own
182+
`pattern_formatter-inl.h` no longer surfaces under this toolchain: that
183+
line sits behind `#if defined(__GNUC__) && __GNUC__ < 5`, which Clang
184+
preprocesses out, so it was never actually visible to the analyzer in
185+
this configuration -- not a regression, just a preprocessor conditional
186+
worth being honest about rather than repeating a stale claim.)
187+
188+
### Scaling study
189+
190+
To see parallel speedup past 8 cores, measured on a 32-vCPU GCP
191+
`c2d-standard-32` VM (Ubuntu 24.04, ephemeral -- provisioned, benchmarked,
192+
and torn down for this one run), average of 3 runs per `--jobs` value.
193+
Two corpora, since spdlog's 7 TUs cap meaningful parallelism regardless
194+
of core count:
195+
196+
| `--jobs` | spdlog (7 TUs) | speedup | self-scan (53 TUs) | speedup |
197+
|---|---|---|---|---|
198+
| 1 | 6.64 s | 1.00x | 189.65 s | 1.00x |
199+
| 2 | 3.77 s | 1.76x | 99.74 s | 1.90x |
200+
| 4 | 3.01 s | 2.20x | 53.32 s | 3.56x |
201+
| 8 | 2.35 s | 2.82x | 28.95 s | 6.55x |
202+
| 16 | 2.35 s | 2.82x | 18.34 s | 10.34x |
203+
| 32 | 2.35 s | 2.82x | 17.52 s | 10.82x |
204+
205+
spdlog plateaus immediately at 8 cores (exactly the 7-TU cap predicted
206+
above -- more threads than TUs buys nothing). Self-scan, with more TUs
207+
than cores at every step up to 32, keeps climbing, but with clearly
208+
diminishing returns past 16 (16 -> 32 only gains ~5% more despite
209+
doubling the core count) -- Amdahl's-law-style overhead (the final sort,
210+
thread-pool teardown, and each task's own fixed per-TU setup cost) that
211+
core count alone can't parallelize away. Peak RSS at `--jobs 32` on the
212+
self-scan was ~11.1 GiB (vs. ~0.98 GiB at `--jobs 1`) -- a real memory
213+
cost worth knowing about before pointing high job counts at a large
214+
project on a memory-constrained machine. All job counts produced
215+
identical findings (verified via `diff`), including on the demo project
216+
run directly on this VM.
217+
218+
This is still closer to "two honest data points" than a real benchmark
219+
suite -- see [`docs/spec.md`](docs/spec.md) §14 for what a full suite
220+
(synthetic corpus, cold/warm, scaling *and* memory as first-class
221+
dimensions, regression gating) would still need to add.
188222

189223
## Known limitations
190224

0 commit comments

Comments
 (0)