Performance and latency
Measured cold start, warm read latency, and verify-path timing for Fuse, sourced from the recorded benchmark result files.
Fuse builds the persistent index once and reads it warm across calls. This page publishes measured latencies as a regression fence: every number is traceable to a recorded result file under tests/benchmarks/results, regenerated with fuse eval performance, fuse resident-latency, and fuse testexec. Timings are environment-dependent; read them as within-environment SLOs, not cross-machine guarantees.
Warm persistent index
Fuse analyzes each source file and stores the result in a persistent SQLite database at .fuse/fuse.db (WAL mode). The MCP server (fuse mcp serve) and the host process reuse that store, so scoped calls do not re-parse unchanged files. Single-file incremental re-index clears and re-extracts only the changed file's syntax rows; it does not recompute cross-file semantic edges, which a full re-index refreshes.
One-shot CLI commands pay startup cost on every invocation. A long-running server pays it once per session; warm latencies below apply after that first pass. The separate live compilation workspace is opt-in with FUSE_RESIDENT=1. Cache key derivation and store layout are in Caching Internals.
Warm read verbs (two scales)
Each verb is the primitive the matching MCP tool calls, timed over 25 iterations at two scales: NodaTime (512 files, 7,657 symbols, performance.json) and eShopOnWeb (287 files, 1,216 symbols, performance-eshop.json).
| Verb (tool) | NodaTime P50 | NodaTime P95 | eShopOnWeb P50 | eShopOnWeb P95 |
|---|---|---|---|---|
Exact symbol lookup (fuse_find) | 2.2 ms | 3.6 ms | 0.1 ms | 0.2 ms |
Blast radius (fuse_impact) | ~0 ms | ~0 ms | ~0 ms | ~0 ms |
Localize (fuse_find kind=task) | 23.4 ms | 25.2 ms | 2.6 ms | 4.2 ms |
Resolve symbol (fuse_find kind=service) | ~0 ms | 0.1 ms | ~0 ms | ~0 ms |
Review plan (fuse_review) | 97.8 ms | 101.3 ms | 38.3 ms | 41.6 ms |
| Single-file incremental re-index | 20.9 ms | 25.4 ms | 1.9 ms | 2.3 ms |
Every recorded warm read sits inside a sub-second budget on this machine. eShopOnWeb is faster in this run, but two repositories do not establish a proportional scaling law. fuse_impact reads ~0 ms on these syntax-mode checkouts because there is no semantic graph to walk; on a semantically loaded checkout the query walks real edges, bounded by neighborhood size.
Verify verbs (NodaTime, resident-latency.json)
fuse_check answers from a live resident workspace when one serves the root. This path is opt-in with FUSE_RESIDENT=1; the default store-backed path is not represented by these timings. The operations below were timed over 25 iterations against held compilations:
| Verify operation | P50 | P95 | Gate |
|---|---|---|---|
| Overlay check, analyzers off (speculative typecheck) | 31.2 ms | 42.4 ms | P95 < 1000 ms: PASS |
| Delta mode, whole-state diff | 203.9 ms | 699.3 ms | P95 < 1000 ms: PASS |
| Raw analyzer execution (284 analyzers) | 871.8 ms | 886.9 ms | Informational |
The analyzer timing measures raw analyzer execution against the held compilation. It does not measure editorconfig severity mapping or establish full CI parity. The resident workspace warms once (build plus rehydrate) at about 14.1 seconds and holds the compilations at 162 MB RSS for the NodaTime checkout.
Test execution (testexec.json)
The build-grade covering-test runner (behind fuse_test) runs the selected covering subset through the real dotnet test:
| Operation | Median |
|---|---|
| Covering-test run (build-grade, incremental) | 1,792 ms |
The first run pays the full build; each subsequent incremental run (one file changed) is about 1.8 s. The sub-second emit fast-path (run the covering subset in-process against the emitted assembly, no build) is a named follow-up.
Cold start
Measured on NodaTime (performance.json) and eShopOnWeb (performance-eshop.json):
| Milestone | NodaTime | eShopOnWeb |
|---|---|---|
| Syntax tier served (no MSBuild) | 17,840 ms | 618 ms |
| Semantic-ready (background upgrade) | +48,329 ms | +3,479 ms |
Full synchronous semantic index (fuse index) | 24,554 ms | 2,795 ms |
fuse mcp serve uses syntax-first cold start by default, then upgrades the semantic graph in the background. Set FUSE_BG_UPGRADE=0, false, no, or off to make the first read index synchronously. The explicit fuse index command is always synchronous.
Distribution
Fuse distributes as a framework-dependent .NET global tool and as self-contained runtime-specific packages:
| Package | Role |
|---|---|
Fuse | Framework-dependent dotnet tool with RollForward=LatestMajor and ReadyToRun |
Fuse.Runtime.win-x64 (and other RIDs) | Self-contained binary for that runtime identifier |
| Windows installer | Ships the self-contained fuse.exe from the release workflow |
Roslyn structural analysis is always included; there is no trimmed or regex-only binary.
How these are regenerated
fuse eval performance --repo NodaTime # warm reads + cold start -> performance.json
fuse eval performance --repo eShopOnWeb # second scale point -> performance-eshop.json
fuse testexec # build-grade test execution -> testexec.json
fuse resident-latency # verify verbs -> resident-latency.jsonToken efficiency (median tokens a review returns) is on Benchmarks. Test-selection latency is the covering-tests query inside fuse_impact; a standalone timer for it is follow-up work.
Next
Read Benchmarks for recall and token suites, Caching Internals for store reuse, or Pipeline for the stages behind a fusion.