Skip to content

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.

21 of 51commands on the large repository are within 1.2× or 0.1 s of stock jj
4commands cost 2 s or more extra on at least one repository, or don't finish
at least 5 min 44 sextra waiting if you ran every command once on the large repository, counting the timed-out command at the timeout; 94% of it is jj git clone, jj file annotate and jj log
commandrepositorygirt vs stockextrarelative extra timetracking
jj file annotate most-edited filejj file annotate <file>large3 min 40 s vs 3 min 13 s+27.3 s
jj log whole history as a graphjj log -r '::@'large6 min 18 s vs 6 min 13 s+4.86 s
jj git clone local pathjj git clone origin.git repomedium18.2 s vs 14.0 s+4.15 s#218
jj log every commit idjj log -r 'all()' --no-graph -T 'commit_id ++ "\n"'large10.9 s vs 8.12 s+2.76 s#222
jj status 10,000 new distinct filesjj statuslarge4.57 s vs 2.94 s+1.62 s#220
jj status 10,000 new identical filesjj statuslarge3.15 s vs 1.97 s+1.18 s#66
jj commit 100 edited filesjj commit -m matrix-commitlarge2.12 s vs 1.13 s+991 ms#453
jj rebase 100 changesjj rebase -s 'roots(<main>..@)' -d <main~20>large2.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).

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.

Arrange
Colour by
Compare with
Hide commands that change by less than
faster by 0.1 s or moreunder 0.1 s: not noticeable0.1 to 0.5 s: noticeable0.5 to 2 s: a pause2 to 10 s: slowover 10 s: painful
commandsmall jj, Feb 2023 18k objects measured 17 Oct 2026medium git.git + branches 421k objects measured 17 Oct 2026large 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.

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

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).

  • 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.