aboutsummaryrefslogtreecommitdiffstats
path: root/research/experiments/008-tree-store-edit-cost/2026-09-25-ext4-linux-aarch64.json
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-25 09:33:43 +0100
committereunhhu <[email protected]>2026-09-25 09:33:43 +0100
commit6a28879bd56354483fe940c0c80d511eccb89983 (patch)
treeed919d234ea2dbe8099e53fae51e495d8bee984e /research/experiments/008-tree-store-edit-cost/2026-09-25-ext4-linux-aarch64.json
parent8a65fd032e6f74938caf84d6f6fcda6314e76a01 (diff)
downloadpure-6a28879bd56354483fe940c0c80d511eccb89983.tar.gz
pure-6a28879bd56354483fe940c0c80d511eccb89983.zip
Add selected single-file persistent tree store
store-tree.c keeps every document in one append-only file as a persistent B-tree of byte extents, with the key catalog in the same structure. A splice writes only the changed leaf and path; unchanged extents are shared between versions, readers take no lock, and two alternating head slots publish a commit after its nodes are durable. Compaction rewrites reachable nodes. On the recorded ext4 host a durable 1-byte middle insert into a 1 MiB document took 8.58 ms against 78.51 ms for the default store, and the real TUI's Ctrl+S after typing took 16.60 ms against 84.59 ms. check-tree runs the store's crash/oracle tests and the unchanged runtime, splice, async and real-PTY editor checks on it. It stays opt-in: linked code is 12.7 KB larger and contiguous multi-leaf reads copy.
Diffstat (limited to 'research/experiments/008-tree-store-edit-cost/2026-09-25-ext4-linux-aarch64.json')
-rw-r--r--research/experiments/008-tree-store-edit-cost/2026-09-25-ext4-linux-aarch64.json346
1 files changed, 346 insertions, 0 deletions
diff --git a/research/experiments/008-tree-store-edit-cost/2026-09-25-ext4-linux-aarch64.json b/research/experiments/008-tree-store-edit-cost/2026-09-25-ext4-linux-aarch64.json
new file mode 100644
index 0000000..708346f
--- /dev/null
+++ b/research/experiments/008-tree-store-edit-cost/2026-09-25-ext4-linux-aarch64.json
@@ -0,0 +1,346 @@
+{
+ "device": "/dev/mmcblk0p2",
+ "filesystem": "ext4",
+ "machine": "aarch64",
+ "kernel": "6.18.39+rpt-rpi-2712",
+ "compiler": "cc (Debian 14.2.0-19) 14.2.0",
+ "edits_per_scenario": 32,
+ "results": [
+ {
+ "store": "flat",
+ "op": "insert-middle",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 9.305,
+ "edit_p90_ms": 20.037,
+ "edit_max_ms": 154.578,
+ "write_call_bytes_per_edit": 296,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 312,
+ "whole_read_median_ms": 0.008,
+ "read_checksum": 7776
+ },
+ {
+ "store": "paged",
+ "op": "insert-middle",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 8.463,
+ "edit_p90_ms": 11.859,
+ "edit_max_ms": 64.024,
+ "write_call_bytes_per_edit": 296,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 312,
+ "whole_read_median_ms": 0.01,
+ "read_checksum": 7776
+ },
+ {
+ "store": "tree",
+ "op": "insert-middle",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 8.343,
+ "edit_p90_ms": 11.553,
+ "edit_max_ms": 65.974,
+ "write_call_bytes_per_edit": 432,
+ "device_write_bytes_per_edit": 32768,
+ "store_file_bytes_after": 12272,
+ "whole_read_median_ms": 0.011,
+ "read_checksum": 7776
+ },
+ {
+ "store": "flat",
+ "op": "delete-middle",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 8.506,
+ "edit_p90_ms": 10.021,
+ "edit_max_ms": 65.646,
+ "write_call_bytes_per_edit": 263,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 248,
+ "whole_read_median_ms": 0.008,
+ "read_checksum": 6720
+ },
+ {
+ "store": "paged",
+ "op": "delete-middle",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 8.344,
+ "edit_p90_ms": 9.873,
+ "edit_max_ms": 65.228,
+ "write_call_bytes_per_edit": 263,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 248,
+ "whole_read_median_ms": 0.01,
+ "read_checksum": 6720
+ },
+ {
+ "store": "tree",
+ "op": "delete-middle",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 6.933,
+ "edit_p90_ms": 10.713,
+ "edit_max_ms": 11.529,
+ "write_call_bytes_per_edit": 399,
+ "device_write_bytes_per_edit": 32768,
+ "store_file_bytes_after": 11216,
+ "whole_read_median_ms": 0.011,
+ "read_checksum": 6720
+ },
+ {
+ "store": "flat",
+ "op": "replace-end",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 8.321,
+ "edit_p90_ms": 9.878,
+ "edit_max_ms": 27.943,
+ "write_call_bytes_per_edit": 280,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 280,
+ "whole_read_median_ms": 0.008,
+ "read_checksum": 6944
+ },
+ {
+ "store": "paged",
+ "op": "replace-end",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 8.409,
+ "edit_p90_ms": 9.723,
+ "edit_max_ms": 62.134,
+ "write_call_bytes_per_edit": 280,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 280,
+ "whole_read_median_ms": 0.01,
+ "read_checksum": 6944
+ },
+ {
+ "store": "tree",
+ "op": "replace-end",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 9.141,
+ "edit_p90_ms": 16.762,
+ "edit_max_ms": 62.869,
+ "write_call_bytes_per_edit": 416,
+ "device_write_bytes_per_edit": 32768,
+ "store_file_bytes_after": 11744,
+ "whole_read_median_ms": 0.011,
+ "read_checksum": 6944
+ },
+ {
+ "store": "flat",
+ "op": "append-end",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 9.068,
+ "edit_p90_ms": 10.062,
+ "edit_max_ms": 62.784,
+ "write_call_bytes_per_edit": 296,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 312,
+ "whole_read_median_ms": 0.012,
+ "read_checksum": 7984
+ },
+ {
+ "store": "paged",
+ "op": "append-end",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 8.613,
+ "edit_p90_ms": 10.037,
+ "edit_max_ms": 59.767,
+ "write_call_bytes_per_edit": 296,
+ "device_write_bytes_per_edit": 16384,
+ "store_file_bytes_after": 312,
+ "whole_read_median_ms": 0.015,
+ "read_checksum": 7984
+ },
+ {
+ "store": "tree",
+ "op": "append-end",
+ "document_bytes": 256,
+ "edits": 32,
+ "edit_median_ms": 6.468,
+ "edit_p90_ms": 11.041,
+ "edit_max_ms": 61.441,
+ "write_call_bytes_per_edit": 432,
+ "device_write_bytes_per_edit": 32768,
+ "store_file_bytes_after": 12272,
+ "whole_read_median_ms": 0.017,
+ "read_checksum": 7984
+ },
+ {
+ "store": "flat",
+ "op": "insert-middle",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 78.508,
+ "edit_p90_ms": 82.768,
+ "edit_max_ms": 83.984,
+ "write_call_bytes_per_edit": 1048616,
+ "device_write_bytes_per_edit": 1064960,
+ "store_file_bytes_after": 1048632,
+ "whole_read_median_ms": 0.102,
+ "read_checksum": 28574496
+ },
+ {
+ "store": "paged",
+ "op": "insert-middle",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 86.573,
+ "edit_p90_ms": 103.801,
+ "edit_max_ms": 108.102,
+ "write_call_bytes_per_edit": 1065528,
+ "device_write_bytes_per_edit": 1081344,
+ "store_file_bytes_after": 1065528,
+ "whole_read_median_ms": 0.07,
+ "read_checksum": 28574496
+ },
+ {
+ "store": "tree",
+ "op": "insert-middle",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 8.58,
+ "edit_p90_ms": 16.685,
+ "edit_max_ms": 64.33,
+ "write_call_bytes_per_edit": 2732,
+ "device_write_bytes_per_edit": 35328,
+ "store_file_bytes_after": 1138480,
+ "whole_read_median_ms": 0.262,
+ "read_checksum": 28574496
+ },
+ {
+ "store": "flat",
+ "op": "delete-middle",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 78.755,
+ "edit_p90_ms": 81.697,
+ "edit_max_ms": 86.715,
+ "write_call_bytes_per_edit": 1048583,
+ "device_write_bytes_per_edit": 1060352,
+ "store_file_bytes_after": 1048568,
+ "whole_read_median_ms": 0.065,
+ "read_checksum": 28573440
+ },
+ {
+ "store": "paged",
+ "op": "delete-middle",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 85.293,
+ "edit_p90_ms": 93.573,
+ "edit_max_ms": 108.718,
+ "write_call_bytes_per_edit": 1049136,
+ "device_write_bytes_per_edit": 1064960,
+ "store_file_bytes_after": 1049136,
+ "whole_read_median_ms": 0.077,
+ "read_checksum": 28573440
+ },
+ {
+ "store": "tree",
+ "op": "delete-middle",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 8.512,
+ "edit_p90_ms": 11.869,
+ "edit_max_ms": 14.455,
+ "write_call_bytes_per_edit": 4907,
+ "device_write_bytes_per_edit": 37376,
+ "store_file_bytes_after": 1208072,
+ "whole_read_median_ms": 0.229,
+ "read_checksum": 28573440
+ },
+ {
+ "store": "flat",
+ "op": "replace-end",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 79.202,
+ "edit_p90_ms": 86.6,
+ "edit_max_ms": 90.952,
+ "write_call_bytes_per_edit": 1048600,
+ "device_write_bytes_per_edit": 1064960,
+ "store_file_bytes_after": 1048600,
+ "whole_read_median_ms": 0.063,
+ "read_checksum": 28573664
+ },
+ {
+ "store": "paged",
+ "op": "replace-end",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 13.959,
+ "edit_p90_ms": 23.871,
+ "edit_max_ms": 69.901,
+ "write_call_bytes_per_edit": 16944,
+ "device_write_bytes_per_edit": 32768,
+ "store_file_bytes_after": 1573424,
+ "whole_read_median_ms": 0.074,
+ "read_checksum": 28573664
+ },
+ {
+ "store": "tree",
+ "op": "replace-end",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 6.488,
+ "edit_p90_ms": 8.209,
+ "edit_max_ms": 60.301,
+ "write_call_bytes_per_edit": 4912,
+ "device_write_bytes_per_edit": 37376,
+ "store_file_bytes_after": 1208232,
+ "whole_read_median_ms": 0.37,
+ "read_checksum": 28573664
+ },
+ {
+ "store": "flat",
+ "op": "append-end",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 77.885,
+ "edit_p90_ms": 86.005,
+ "edit_max_ms": 89.824,
+ "write_call_bytes_per_edit": 1048616,
+ "device_write_bytes_per_edit": 1064960,
+ "store_file_bytes_after": 1048632,
+ "whole_read_median_ms": 0.062,
+ "read_checksum": 28574704
+ },
+ {
+ "store": "paged",
+ "op": "append-end",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 86.039,
+ "edit_p90_ms": 102.765,
+ "edit_max_ms": 121.611,
+ "write_call_bytes_per_edit": 1065528,
+ "device_write_bytes_per_edit": 1081344,
+ "store_file_bytes_after": 1065528,
+ "whole_read_median_ms": 0.07,
+ "read_checksum": 28574704
+ },
+ {
+ "store": "tree",
+ "op": "append-end",
+ "document_bytes": 1048576,
+ "edits": 32,
+ "edit_median_ms": 8.473,
+ "edit_p90_ms": 11.691,
+ "edit_max_ms": 60.672,
+ "write_call_bytes_per_edit": 2716,
+ "device_write_bytes_per_edit": 35328,
+ "store_file_bytes_after": 1137960,
+ "whole_read_median_ms": 0.225,
+ "read_checksum": 28574704
+ }
+ ]
+}