Speed budgets
Speed is something furca promises, not something it hopes for. Each promise below is a budget: an operation, the kind of repository it is measured on, and how long it may take. The benchmark that measures them is part of the gate - a broken budget fails the build the same way a failing test does - and every release carries the numbers its own build measured on Windows, Linux and macOS.
Promised
Measured on a synthetic repository of 100,000 commits - a mainline with merged feature branches, open branches, tags and commits from slow clocks.
| What | Repository | Budget |
|---|---|---|
| Open a repository and read the first 500 commits of its graph, from every branch and tag | packed+commit-graph | < 100 ms |
| The same, on a repository without a commit-graph file | packed | measured, not promised |
| Start the desktop app to its first drawn frame | packed+commit-graph | < 300 ms, measured from v0.7.0 |
| Working tree status after a file is saved, in a repository of up to 10 000 files | packed+commit-graph | < 50 ms, measured from v0.10.0 |
| Show a 5 000-line diff | packed+commit-graph | < 30 ms, measured from v0.9.0 |
packed: Not promised. Without generation numbers the exact order needs the whole history walked first, and git itself takes as long. The desktop app closes this by having git write the commit-graph.
Measured
| Release | Platform | Repository | Median | 90th percentile | Budget |
|---|---|---|---|---|---|
| v0.3.0 | macos aarch64 | packed+commit-graph | 4.5 ms | 5.1 ms | kept (< 100 ms) |
| v0.3.0 | macos aarch64 | packed | 381.6 ms | 406.7 ms | - |
| v0.3.0 | windows x86_64 | packed+commit-graph | 15.3 ms | 15.6 ms | kept (< 100 ms) |
| v0.3.0 | windows x86_64 | packed | 566.4 ms | 582.1 ms | - |
| v0.3.0 | linux x86_64 | packed+commit-graph | 6.2 ms | 6.6 ms | kept (< 100 ms) |
| v0.3.0 | linux x86_64 | packed | 471.7 ms | 478.6 ms | - |
| v0.2.0 | macos aarch64 | packed+commit-graph | 5.3 ms | 6.1 ms | kept (< 100 ms) |
| v0.2.0 | macos aarch64 | packed | 493.3 ms | 541.5 ms | - |
| v0.2.0 | windows x86_64 | packed+commit-graph | 14.2 ms | 14.7 ms | kept (< 100 ms) |
| v0.2.0 | windows x86_64 | packed | 585.8 ms | 595.4 ms | - |
| v0.2.0 | linux x86_64 | packed+commit-graph | 6.4 ms | 6.4 ms | kept (< 100 ms) |
| v0.2.0 | linux x86_64 | packed | 518.8 ms | 523.5 ms | - |
How it is measured
Section titled “How it is measured”The repository is generated, not cloned: the same history on every machine and
every run, built by git fast-import and then left the way git gc leaves a
repository - one pack, packed refs, and a commit-graph file.
Each budget is timed 21 times after 3 warm-up runs, and the median is what the budget is held to; the 90th percentile is published next to it. A run starts from nothing: the repository is opened afresh each time, so the number is what a window pays when it opens a repository, not what a warm cache pays.
A median over the budget is measured once more after a pause before the build fails. A machine that is busy elsewhere slows every run for seconds at a time; a regression stays over the budget on the second try.
Why the commit-graph matters
Section titled “Why the commit-graph matters”The graph is listed so that no commit comes before any of its children. Knowing
that a commit has no children left to list means having looked at every commit
that could be one. Generation numbers - stored in the commit-graph file that
git gc writes - bound that search, so the first 500 commits of a long history
touch a few thousand commits rather than all of them. Without the file, the
exact order needs the whole history walked first; git log --date-order pays
the same. See
ADR 0005.
Next to Fork
Section titled “Next to Fork”One measurement by hand, on one machine, on the repository above. The three tools do different amounts of work - Fork draws a window - so this is where the time goes for someone opening a repository, not a like-for-like benchmark.
Measured 2026-09-23 on Windows 11 laptop, 16 GB, with the usual work running alongside, on the budget fixture: 100 000 commits, packed, with a commit-graph.
| Tool | What was timed | Median | Runs |
|---|---|---|---|
| furca 0.2.0 | furca log --all -n 500 --json, from starting the process to its last byte of output | 371 ms | 879 ms, 368 ms, 376 ms, 371 ms, 313 ms |
| git 2.42.0 | git log --all --date-order -n 500, from starting the process to its last byte of output | 436 ms | 523 ms, 436 ms, 360 ms |
| Fork 2.22.0 | Fork already running; the repository opened from the command line, until the head commit's details show | 3,075 ms | 3,579 ms, 2,681 ms, 3,075 ms |