Benchmarks: commit after one manifest write and parallel diffs; fresh store size against Git (refs #41) 4f264d6f20b6
- Author
- Andy McCall @andymccall <[email protected]>
- When
- · 2026-10-02 02:39 UTC
- Signature
- ✔ signed by Andy McCall
- Hash
4f264d6f20b65ff1f248b38ca76d5c8d9dea82368884f3e5cca01bca1113d299- Depends on
- 0389c3e82f6c 1d360c91a289
- Depended on by
- 87828a0b1f36 dd6147dcf9c2
- In bookmarks
- agents-in-readme bare-hashes carried-not-removed carry-identical doctor-trust identical-sides keyless-tags main merge-remote-bookmark only-help-103 paths-for-resolutions-and-amend push-notes show-stat subrepo-pin-state switch-says
- In tags
- v0.10.0 v0.11.0 v0.3.0 v0.3.1 v0.4.0 v0.4.1 v0.4.2 v0.4.3 v0.4.4 v0.4.5 v0.4.6 v0.5.0 v0.5.1 v0.6.0 v0.7.0 v0.8.0 v0.9.0
- Edits
- 1 atom, 0 tree operations, 1 file
Browse the tree at this change
modified docs/benchmarks.md +36 −0
| … | 918 unchanged lines |
||
| 919 | 919 | directories it listed (Git restamps its index the same way): the first |
|
| 920 | 920 | status after a checkout takes 0.15 s, the ones after it 0.10 s again. |
|
| 921 | 921 | ||
| 922 | + | ||
| 923 | + | ### Commit: one manifest write, parallel diffs (2026-10-02, oxygen#41) |
|
| 924 | + | ||
| 925 | + | A commit's snapshot now hands its manifest rows to the commit, which |
|
| 926 | + | writes the manifest once with the new base's graph keys; before, the |
|
| 927 | + | snapshot wrote it and the commit read and rewrote it. The change builder |
|
| 928 | + | diffs edited text files in parallel before updating them one by one. |
|
| 929 | + | ||
| 930 | + | | | before | now | Git | |
|
| 931 | + | |---|---:|---:|---:| |
|
| 932 | + | | commit, one file, straight after the edit | 0.55 s | 0.34 to 0.45 s | 0.15 s | |
|
| 933 | + | | commit, 1 000 files | 0.99 s | 0.79 to 0.86 s | 1.1 to 1.2 s | |
|
| 934 | + | ||
| 935 | + | Of the one-file commit, about 135 ms is the operation's fsync: on ext4 |
|
| 936 | + | with ordered data the first sync also writes the edited file's data. |
|
| 937 | + | Git's default commit does not sync loose objects. Of the 1 000-file |
|
| 938 | + | commit: building the change 72 ms (from 243), one read of the Linux |
|
| 939 | + | import's root change for the inline texts of about 90 of the files |
|
| 940 | + | (110 ms), rendering 97 ms, graph building 67 ms, the stat check 80 ms. |
|
| 941 | + | ||
| 942 | + | ### Fresh store size and first commit (2026-10-02, P1 and S7) |
|
| 943 | + | ||
| 944 | + | `~/bench/p1.sh`: the Linux tip (95 942 files, 1.8 GB) committed fresh by |
|
| 945 | + | oxy and by Git in scratch copies, then gc. |
|
| 946 | + | ||
| 947 | + | | | oxy | Git | |
|
| 948 | + | |---|---:|---:| |
|
| 949 | + | | init and first commit | **25.2 s**, 3.1 GB peak | 30.8 s, 41 MB | |
|
| 950 | + | | objects after gc | **265 MB** | 285 MB | |
|
| 951 | + | | whole `.oxy` / `.git` | **278 MB** | 295 MB | |
|
| 952 | + | ||
| 953 | + | The bench repository's store is larger (290 MB of objects) because builds |
|
| 954 | + | before this one also stored the working-copy change a first commit's |
|
| 955 | + | snapshot made: an 85 MB change (21 MB packed) twice. A commit's snapshot |
|
| 956 | + | no longer stores it. The first commit's peak memory (S7, under 2 GB) is |
|
| 957 | + | still open: the walk holds every file's text. |