jj on girt benchmark
This benchmark runs the same jj commands with jj built on girt and with stock jj (which uses gix and
the git executable), and times the closest git command alongside. It uses three real
repositories, described under Test repositories: an early 2023 snapshot of jj
(small), git.git with extra branches (medium) and Linux v6.1 (large).
jj on girt is not ready for everyday use. Read this page as a dashboard of the gap still to close: every rust-tinted cell is work left to do, and the headline numbers are the ones to drive down.
Colour shows the extra time you wait, not the ratio. A 10 ms command that is 3× slower stays plain; one that costs an extra minute is dark. Commands girt makes faster are tinted green.
jj git clone, jj file annotate and jj log| command | repository | girt vs stock | extra | relative extra time | tracking |
|---|---|---|---|---|---|
jj file annotate most-edited filejj file annotate <file> | large | 3 min 40 s vs 3 min 13 s | +27.3 s | ||
jj log whole history as a graphjj log -r '::@' | large | 6 min 18 s vs 6 min 13 s | +4.86 s | ||
jj git clone local pathjj git clone origin.git repo | medium | 18.2 s vs 14.0 s | +4.15 s | #218 | |
jj log every commit idjj log -r 'all()' --no-graph -T 'commit_id ++ "\n"' | large | 10.9 s vs 8.12 s | +2.76 s | #222 | |
jj status 10,000 new distinct filesjj status | large | 4.57 s vs 2.94 s | +1.62 s | #220 | |
jj status 10,000 new identical filesjj status | large | 3.15 s vs 1.97 s | +1.18 s | #66 | |
jj commit 100 edited filesjj commit -m matrix-commit | large | 2.12 s vs 1.13 s | +991 ms | #453 | |
jj rebase 100 changesjj rebase -s 'roots(<main>..@)' -d <main~20> | large | 2.88 s vs 1.90 s | +974 ms | #222#453 |
Didn't finish: jj git clone local path on large timed out after 9 min 45 s (stock jj 4 min 53 s).
Every command
Section titled “Every command”Rows are grouped by how often you run the command, because a delay that is fine for jj git clone
is painful for jj status. Each row shows the jj command line it times. Select a row for the
repository state it runs against, the git command it is compared with, sample ranges and tracking
issues; hover over a cell for its numbers.
Unless a row says otherwise, each command runs in a fresh copy of a local clone colocated with
jj git init --colocate, so the working copy is an empty change on top of the main branch.
| command | small jj, Feb 2023 18k objects measured 17 Oct 2026 | medium git.git + branches 421k objects measured 17 Oct 2026 | large Linux v6.1 9.1M objects measured 17 Oct 2026 |
|---|---|---|---|
| Constantly run many times an hour while working: inspecting and editing changes | |||
3.22 sstock 2.60 s · 1.24×measured on girt 0.13.1 | 3.30 sstock 2.40 s · 1.37×measured on girt 0.13.1 | 4.57 sstock 2.94 s · 1.55× |
|
410 msstock 1.88 s · 0.22×measured on girt 0.13.1 | 506 msstock 1.74 s · 0.29×measured on girt 0.13.1 | 3.15 sstock 1.97 s · 1.60× |
|
157 msstock 153 ms · 1.03×measured on girt 0.13.1 | 230 msstock 208 ms · 1.11×measured on girt 0.13.1 | 2.12 sstock 1.13 s · 1.88× |
|
50 msstock 45 ms · 1.11×measured on girt 0.13.1 | 130 msstock 111 ms · 1.17×measured on girt 0.13.1 | 2.03 sstock 1.23 s · 1.65× |
|
188 msstock 171 ms · 1.10×measured on girt 0.13.1 | 235 msstock 226 ms · 1.04×measured on girt 0.13.1 | 1.87 sstock 1.18 s · 1.59× |
|
71 msstock 60 ms · 1.17×measured on girt 0.13.1 | 157 msstock 131 ms · 1.20×measured on girt 0.13.1 | 1.60 sstock 951 ms · 1.68× |
|
61 msstock 58 ms · 1.05×measured on girt 0.13.1 | 141 msstock 119 ms · 1.19×measured on girt 0.13.1 | 1.60 sstock 964 ms · 1.66× |
|
73 msstock 68 ms · 1.08×measured on girt 0.13.1 | 163 msstock 141 ms · 1.16×measured on girt 0.13.1 | 1.60 sstock 972 ms · 1.65× |
|
52 msstock 46 ms · 1.13×measured on girt 0.13.1 | 142 msstock 118 ms · 1.20×measured on girt 0.13.1 | 1.60 sstock 982 ms · 1.63× |
|
64 msstock 60 ms · 1.06×measured on girt 0.13.1 | 151 msstock 127 ms · 1.18×measured on girt 0.13.1 | 1.60 sstock 996 ms · 1.61× |
|
164 msstock 140 ms · 1.16×measured on girt 0.13.1 | 387 msstock 352 ms · 1.10×measured on girt 0.13.1 | 1.12 sstock 783 ms · 1.43× |
|
179 msstock 142 ms · 1.26× | 193 msstock 170 ms · 1.14× | 710 msstock 472 ms · 1.50× |
|
172 msstock 148 ms · 1.16× | 207 msstock 168 ms · 1.23× | 716 msstock 500 ms · 1.43× |
|
172 msstock 154 ms · 1.12× | 198 msstock 171 ms · 1.16× | 708 msstock 515 ms · 1.37× |
|
42 msstock 42 ms · 1.01×measured on girt 0.13.1 | 82 msstock 70 ms · 1.17×measured on girt 0.13.1 | 598 msstock 423 ms · 1.42× |
|
79 msstock 67 ms · 1.18×measured on girt 0.13.1 | 114 msstock 110 ms · 1.03×measured on girt 0.13.1 | 560 msstock 420 ms · 1.33× |
|
276 msstock 139 ms · 1.98×measured on girt 0.14.0 | 223 msstock 204 ms · 1.09×measured on girt 0.14.0 | 272 msstock 242 ms · 1.13× |
|
43 msstock 41 ms · 1.07×measured on girt 0.13.1 | 83 msstock 73 ms · 1.14×measured on girt 0.13.1 | 465 msstock 343 ms · 1.35× |
|
20 msstock 20 ms · 1.02× | 7.08 sstock 7.75 s · 0.91×measured on girt 0.14.0 | 218 msstock 222 ms · 0.98× |
|
| Hourly run several times a day: syncing with remotes and reshaping history | |||
173 msstock 181 ms · 0.96× | 10.4 sstock 12.1 s · 0.86× | 3 min 40 sstock 3 min 13 s · 1.14×measured on girt 0.14.0 |
|
932 msstock 1.11 s · 0.84×measured on girt 0.13.1 | 1.26 sstock 1.10 s · 1.15×measured on girt 0.13.1 | 2.88 sstock 1.90 s · 1.51× |
|
71 msstock 61 ms · 1.15×measured on girt 0.13.1 | 140 msstock 120 ms · 1.17×measured on girt 0.13.1 | 1.78 sstock 957 ms · 1.86× |
|
174 msstock 152 ms · 1.14×measured on girt 0.13.1 | 287 msstock 245 ms · 1.17×measured on girt 0.13.1 | 1.79 sstock 1.09 s · 1.64× |
|
53 msstock 46 ms · 1.16×measured on girt 0.13.1 | 142 msstock 116 ms · 1.22×measured on girt 0.13.1 | 1.64 sstock 964 ms · 1.70× |
|
87 msstock 76 ms · 1.15×measured on girt 0.13.1 | 203 msstock 175 ms · 1.16×measured on girt 0.13.1 | 1.70 sstock 1.07 s · 1.59× |
|
79 msstock 70 ms · 1.14×measured on girt 0.13.1 | 167 msstock 141 ms · 1.19×measured on girt 0.13.1 | 1.65 sstock 1.05 s · 1.57× |
|
75 msstock 67 ms · 1.12×measured on girt 0.13.1 | 167 msstock 147 ms · 1.14×measured on girt 0.13.1 | 1.60 sstock 1.01 s · 1.58× |
|
41 msstock 39 ms · 1.05×measured on girt 0.13.1 | 116 msstock 88 ms · 1.32×measured on girt 0.13.1 | 1.24 sstock 862 ms · 1.44× |
|
74 msstock 68 ms · 1.09× | 258 msstock 222 ms · 1.16× | 875 msstock 614 ms · 1.43× |
|
114 msstock 75 ms · 1.51× | 233 msstock 84 ms · 2.77× | 284 msstock 105 ms · 2.69× |
|
333 msstock 1.15 s · 0.29× | 595 msstock 1.13 s · 0.53× | 2.23 sstock 2.08 s · 1.07× |
|
238 msstock 217 ms · 1.10× | 1.18 sstock 1.58 s · 0.75× | 1.12 sstock 1.01 s · 1.11× |
|
128 msstock 118 ms · 1.09×measured on girt 0.13.1 | 194 msstock 164 ms · 1.18×measured on girt 0.13.1 | 497 msstock 390 ms · 1.27× |
|
32 msstock 58 ms · 0.55× | 646 msstock 780 ms · 0.83× | 579 msstock 534 ms · 1.08× |
|
711 msstock 2.03 s · 0.35× | 470 msstock 628 ms · 0.75× | 1.81 sstock 1.77 s · 1.02× |
|
376 msstock 362 ms · 1.04× | 184 msstock 422 ms · 0.44× | 414 msstock 384 ms · 1.08× |
|
81 msstock 106 ms · 0.76× | 402 msstock 753 ms · 0.53× | 850 msstock 985 ms · 0.86× |
|
156 msstock 195 ms · 0.80× | 540 msstock 775 ms · 0.70× | 964 msstock 1.05 s · 0.92× |
|
98 msstock 159 ms · 0.62× | 691 msstock 761 ms · 0.91× | 1.49 sstock 2.27 s · 0.66× |
|
| Occasionally setup, maintenance and full-history dumps | |||
549 msstock 606 ms · 0.91×measured on girt 0.13.1 | 18.2 sstock 14.0 s · 1.30×measured on girt 0.14.0 | timed out at 9 min 45 sstock 4 min 53 smeasured on girt 0.14.0 |
|
354 msstock 420 ms · 0.84×measured on girt 0.14.0 | 1 min 6 sstock 1 min 45 s · 0.63×measured on girt 0.14.0 | 6 min 18 sstock 6 min 13 s · 1.01×measured on girt 0.14.0 |
|
53 msstock 46 ms · 1.16× | 933 msstock 700 ms · 1.33× | 10.9 sstock 8.12 s · 1.34× |
|
222 msstock 223 ms · 1.00×measured on girt 0.13.1 | 2.92 sstock 2.51 s · 1.16×measured on girt 0.14.0 | 31.7 sstock 31.7 s · 1.00×measured on girt 0.14.0 |
|
176 msstock 183 ms · 0.96×measured on girt 0.13.1 | 1.17 sstock 1.13 s · 1.04×measured on girt 0.13.1 | 21.2 sstock 29.8 s · 0.71×measured on girt 0.14.0 |
|
42 msstock 231 ms · 0.18×not like-for-like | 563 msstock 8.25 s · 0.07×not like-for-like | 1.99 sstock 2 min 16 s · 0.01×not like-for-like |
|
382 msstock 681 ms · 0.56×not like-for-like | 11.4 sstock 9.67 s · 1.18×not like-for-likemeasured on girt 0.14.0 | 3 min 47 sstock 3 min 8 s · 1.21×not like-for-likemeasured on girt 0.14.0 |
|
7 more commands are within 100 ms of stock jj on every repository.
Test repositories
Section titled “Test repositories”These three repositories are what the benchmark has used so far. They are not a deliberate spread of repository shapes, and a better set will replace them; read the numbers with that in mind.
small: jj, Feb 2023 (fixture jj-historic)
jj’s own repository cut at commit 0ca4e2d (26 February 2023, shortly after jj 0.7.0): 2,847 commits, with main and the ten release tags v0.3.0 to v0.7.0 as its only refs. It is a small, old snapshot, not today’s jj.
18,103 objects · 11 refs · 10 tags · 208 files · 8 MiB pack
medium: git.git + branches (fixture git-git)
git.git at f57c9a7 (15 October 2026), 82,500 commits, plus 2,080 extra branches the fixture builder added, one at each of the 2,080 most recent first-parent commits. That gives it 3,100 refs, far more than a plain clone of git.git.
421,375 objects · 3,100 refs · 1,012 tags · 4,857 files · 308 MiB pack
large: Linux v6.1 (fixture linux-v6.1)
The Linux kernel at the v6.1 release (830b3c6, 11 December 2022), 1.14 million commits, with its own branches and tags and nothing added.
9,103,336 objects · 4,787 refs · 1,770 tags · 78,700 files · 4,205 MiB pack
Method
Section titled “Method”Each tool runs against a fresh copy of the same repository. Caches are warm and machine load was not
controlled, so treat small differences as noise; the provenance above gives the load range. Times
are medians. Most cells take six samples per tool; cells whose first sample takes more than 10
seconds take three, and more than 60 seconds take one, so their ratios are less precise. jj on girt
is stopped once it takes twice as long as stock jj (at least 5 seconds). Some git commands do
different work from their jj counterpart, and Git has no counterpart to jj undo, jj op restore,
jj git import or colocated initialization.
The harness is scripts/jj-e2e/bench-ops.py in the girt repository. Results and provenance live in
docs/jj-performance.json and docs/jj-performance-provenance.json. The underlying gaps are
tracked on girt issue 66 (performance gaps against Git).
Provenance
Section titled “Provenance”- Measured 2026-10-17 (America/Los_Angeles).
- Machine: Apple M2 Max; macOS-26.6.2-arm64-arm-64bit-Mach-O.
- girt: 0.11.1,
69e3985c68e4. - jj with girt: adapter commit
88ed7e9e286c; stock jj:35dbc3623b6d, the adapter's base. - Git: 2.56.0 (release commit
a018953688f1). - Build: release; debug=1; strip=none; codegen-units=1; rustc 1.99.0 (b940084d7 2026-09-28).
- Machine load (one-minute average at each sample): 3.4 to 88.4, median 21.5, on 12 cores. Other work competed with many samples.
- Cells span girt 0.11.1–0.14.0, measured 2026-10-17. Each cell records its release; cells measured on a different release than 0.11.1 are marked.
- The jj adapter commit predates 032e725a on the fork, which skips writing blobs the repository already has during colocated init (#217); the Linux colocated-init timeout was measured without it.