Highlights
- Faster
BTreeMap
: Fewer clones viainto_bytes
(breaking API), lazy iterator (breaking API), faster traversal, batch read/write - Breaking API: Public methods now panic instead of returning
Result
- Benchmarks: Improved coverage (NNS, I/O chunks, principals)
- Improved CI & Docs: Better logs, custom branches benchmark support, and updated documentation.
Migration Guide
To upgrade to v0.7.0, fix any build errors by applying the following changes:
- Remove
.unwrap()
where methods no longer returnResult
— these now panic on misuse - Implement
into_bytes
for your types to support the updated API - Update iteration logic: instead of
(key, value)
tuples, iterate overentry
objects and useentry.key()
andentry.value()
to lazily access data
What's Changed
- Breaking API change
- perf!: remove excessive cloning in btreemap.insert (breaking API change) by @maksymar in #322
- refactor!: replace Result with panic in stable-structures (breaking API change) API by @maksymar in #351
- feat!: add lazy BTreeMap iterator for improved performance (breaking API change) by @maksymar in #375
- Performance improvements
- perf: batch allocate overflow pages in BTreeMap by @maksymar in #357
- perf: speed up iter, range, scan methods with Rc by @maksymar in #356
- perf: use Box instead of Rc in BTreeMap iterator by @maksymar in #360
- perf: faster node traversal and entry extraction in BTreeMap by @maksymar in #363
- perf: add batch read of BTreeMap node children addresses by @maksymar in #364
- perf: add batch write of BTreeMap node children addresses by @maksymar in #365
- Tests and benchmarks
- test: add API conformance tests by @maksymar in #346
- test: fix compare benchmarks by @maksymar in #358
- test: add nns_vote_cascading benchmarks by @maksymar in #371
- test: add benchmarks with principal by @maksymar in #374
- test: rename 'compare' benchmark to 'io_chunks' for clarity by @maksymar in #368
- Docs
- CI & chores
- ci: enable colored CI logs and fix lifetime warnings by @maksymar in #353
- ci: sanitize PR name in Slack notification messages like <&test> by @maksymar in #359
- ci: rename 'main' to 'baseline' to support custom benchmark branches by @maksymar in #366
- ci: re-enable io_chunks benchmark by @maksymar in #369
- ci: enable nns benchmarks by @maksymar in #372
- ci: upload persisted canbench_results.yml file by @maksymar in #376
- chore: fix typos and improve wording by @maksymar in #370
- chore: fix typos by @maksymar in #377
- chore: bump version to v0.7.0 by @maksymar in #379
Full Changelog: v0.6.9...v0.7.0
Benchmarks Diff v0.7.0 vs v0.6.7 (before optimizations)
Google sheets CSV reports link.
Measurements done here.
btreemap
---------------------------------------------------
Summary:
instructions:
status: Regressions and improvements 🔴🟢
counts: [total 303 | regressed 24 | improved 203 | new 0 | unchanged 76]
change: [max +883.02M | p75 -2.11M | median -26.90M | p25 -132.45M | min -1.77B]
change %: [max +13.63% | p75 -0.69% | median -5.16% | p25 -13.61% | min -98.33%]
heap_increase:
status: Improvements detected 🟢
counts: [total 303 | regressed 0 | improved 1 | new 0 | unchanged 302]
change: [max 0 | p75 0 | median 0 | p25 0 | min -161]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min -50.00%]
stable_memory_increase:
status: No significant changes 👍
counts: [total 303 | regressed 0 | improved 0 | new 0 | unchanged 303]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
---------------------------------------------------
Only significant changes:
| status | name | calls | ins | ins Δ% | HI | HI Δ% | SMI | SMI Δ% |
|--------|----------------------------------------------|-------|---------|---------|----|--------|-----|---------|
| + | btreemap_v2_remove_blob_1024_128 | | 7.36B | +13.63% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_remove_blob_512_128 | | 4.07B | +12.87% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_remove_blob_256_128 | | 2.42B | +9.99% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_remove_blob_128_128 | | 1.59B | +7.88% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_insert_blob_1024_128 | | 5.50B | +7.61% | 0 | 0.00% | 196 | 0.00% |
| + | btreemap_v2_insert_blob_512_128 | | 3.04B | +6.39% | 0 | 0.00% | 111 | 0.00% |
| + | btreemap_v2_insert_blob_256_128 | | 1.79B | +6.03% | 0 | 0.00% | 67 | 0.00% |
| + | btreemap_v2_scan_keys_1k_10kib | | 2.50M | +4.37% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_remove_vec_32_64 | | 968.31M | +4.12% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_scan_keys_rev_1k_10kib | | 2.48M | +3.85% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_insert_blob_128_128 | | 1.18B | +3.84% | 0 | 0.00% | 46 | 0.00% |
| + | btreemap_v2_scan_keys_1k_0b | | 982.66K | +3.82% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_remove_vec_32_16 | | 871.33M | +3.65% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_insert_blob_32_0 | | 490.46M | +3.61% | 0 | 0.00% | 8 | 0.00% |
| + | btreemap_v2_remove_blob_32_0 | | 654.25M | +3.01% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_remove_vec_32_0 | | 834.33M | +2.53% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_remove_vec_32_32 | | 867.57M | +2.41% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_insert_blob_32_64 | | 534.92M | +2.28% | 0 | 0.00% | 18 | 0.00% |
| + | btreemap_v2_insert_blob_32_32 | | 528.95M | +2.21% | 0 | 0.00% | 13 | 0.00% |
| + | btreemap_v2_insert_principal | | 503.31M | +2.20% | 0 | 0.00% | 8 | 0.00% |
| + | btreemap_v2_get_vec_16_128 | | 449.74M | +2.16% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_scan_keys_rev_1k_0b | | 984.22K | +2.13% | 0 | 0.00% | 0 | 0.00% |
| + | btreemap_v2_insert_blob_32_8 | | 517.59M | +2.05% | 0 | 0.00% | 9 | 0.00% |
| + | btreemap_v2_remove_vec_32_8 | | 856.48M | +2.04% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_pop_first_blob_32_512 | | 957.57M | -2.13% | 0 | 0.00% | 0 | 0.00% |
| ... | ... 177 rows omitted ... | | | | | | | |
| - | btreemap_v2_mem_manager_insert_vec512_u64 | | 1.96B | -41.01% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_remove_u64_vec512 | | 1.22B | -45.51% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_insert_u64_vec512 | | 834.10M | -46.42% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_remove_u64_blob512 | | 882.97M | -47.67% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_insert_u64_blob512 | | 607.29M | -47.87% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_insert_u64_u64 | | 520.55M | -48.55% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_remove_u64_u64 | | 736.79M | -48.55% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_get_u64_vec512 | | 388.83M | -51.10% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_contains_u64_vec512 | | 367.04M | -53.84% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_get_vec512_u64 | | 1.24B | -54.30% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_get_u64_blob512 | | 295.41M | -55.16% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_get_u64_u64 | | 291.72M | -55.30% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_contains_vec512_u64 | | 1.20B | -55.81% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_contains_u64_u64 | | 283.52M | -56.55% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_mem_manager_contains_u64_blob512 | | 278.86M | -57.67% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_range_value_sum_1k_10kib | | 20.67M | -63.93% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_range_value_sum_20_10mib | | 398.31M | -64.00% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_get_10mib_values | | 388.59M | -68.46% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_contains_10mib_values | | 142.21M | -88.46% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_range_key_sum_1k_10kib | | 2.57M | -95.51% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_scan_iter_1k_10kib | | 2.49M | -95.64% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_scan_iter_rev_1k_10kib | | 2.48M | -95.66% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_scan_iter_20_10mib | | 18.47M | -98.33% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_scan_iter_rev_20_10mib | | 18.47M | -98.33% | 0 | 0.00% | 0 | 0.00% |
| - | btreemap_v2_range_key_sum_20_10mib | | 18.47M | -98.33% | 0 | 0.00% | 0 | 0.00% |
ins = instructions, HI = heap_increase, SMI = stable_memory_increase, Δ% = percent change
---------------------------------------------------
CSV results saved to canbench_results.csv
io_chunks
---------------------------------------------------
Summary:
instructions:
status: Improvements detected 🟢
counts: [total 18 | regressed 0 | improved 12 | new 0 | unchanged 6]
change: [max -986 | p75 -361.15K | median -288.62M | p25 -856.87M | min -85.19B]
change %: [max -0.00% | p75 -0.19% | median -49.33% | p25 -61.06% | min -83.80%]
heap_increase:
status: Regressions and improvements 🔴🟢
counts: [total 18 | regressed 1 | improved 2 | new 0 | unchanged 15]
change: [max +1.60K | p75 0 | median 0 | p25 0 | min -1.62K]
change %: [max +inf% | p75 0.00% | median 0.00% | p25 0.00% | min -99.20%]
stable_memory_increase:
status: No significant changes 👍
counts: [total 18 | regressed 0 | improved 0 | new 0 | unchanged 18]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
---------------------------------------------------
Only significant changes:
| status | name | calls | ins | ins Δ% | HI | HI Δ% | SMI | SMI Δ% |
|--------|--------------------------|-------|---------|---------|-------|---------|-------|---------|
| - | write_chunks_vec_1m | | 1.90B | -28.20% | 0 | 0.00% | 1.54K | 0.00% |
| - | read_chunks_vec_1m | | 1.01B | -46.71% | 0 | 0.00% | 0 | 0.00% |
| - | write_chunks_stable_1m | | 255.41M | -48.45% | 0 | 0.00% | 1.66K | 0.00% |
| - | read_chunks_stable_1m | | 230.00M | -50.22% | 0 | 0.00% | 0 | 0.00% |
| - | write_chunks_btreemap_1m | | 83.66B | -50.45% | 0 | 0.00% | 3.07K | 0.00% |
| - | read_chunks_btreemap_1m | | 40.94B | -53.20% | 0 | 0.00% | 0 | 0.00% |
| - | write_chunks_btreemap_1k | | 4.19B | -56.14% | 2 | -50.00% | 1.54K | 0.00% |
| - | write_chunks_btreemap_1 | | 357.21M | -62.70% | 13 | -99.20% | 1.54K | 0.00% |
| - | read_chunks_btreemap_1k | | 498.23M | -70.99% | 0 | 0.00% | 0 | 0.00% |
| - | read_chunks_vec_1k | | 105.83M | -73.19% | 0 | 0.00% | 0 | 0.00% |
| - | read_chunks_vec_1 | | 104.86M | -73.33% | 0 | 0.00% | 0 | 0.00% |
| +/- | read_chunks_btreemap_1 | | 148.72M | -83.80% | 1.60K | +inf% | 0 | 0.00% |
ins = instructions, HI = heap_increase, SMI = stable_memory_increase, Δ% = percent change
---------------------------------------------------
CSV results saved to canbench_results.csv
nns
---------------------------------------------------
Summary:
instructions:
status: Improvements detected 🟢
counts: [total 16 | regressed 0 | improved 8 | new 0 | unchanged 8]
change: [max -38 | p75 -38 | median -33.92K | p25 -355.99M | min -7.96B]
change %: [max -0.00% | p75 -0.00% | median -21.85% | p25 -50.19% | min -52.56%]
heap_increase:
status: No significant changes 👍
counts: [total 16 | regressed 0 | improved 0 | new 0 | unchanged 16]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
stable_memory_increase:
status: No significant changes 👍
counts: [total 16 | regressed 0 | improved 0 | new 0 | unchanged 16]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
---------------------------------------------------
Only significant changes:
| status | name | calls | ins | ins Δ% | HI | HI Δ% | SMI | SMI Δ% |
|--------|---------------------------------------|-------|---------|---------|----|--------|-----|---------|
| - | vote_cascading_stable_chain_1k_15 | | 867.33M | -43.03% | 0 | 0.00% | 0 | 0.00% |
| - | vote_cascading_stable_chain_10k_15 | | 9.82B | -44.77% | 5 | 0.00% | 0 | 0.00% |
| - | vote_cascading_stable_chain_10k_5 | | 3.01B | -49.16% | 5 | 0.00% | 0 | 0.00% |
| - | vote_cascading_stable_centralized_1k | | 100.00M | -50.15% | 1 | 0.00% | 0 | 0.00% |
| - | vote_cascading_stable_chain_1k_5 | | 253.04M | -50.32% | 0 | 0.00% | 0 | 0.00% |
| - | vote_cascading_stable_single_vote_1k | | 66.84K | -50.36% | 0 | 0.00% | 0 | 0.00% |
| - | vote_cascading_stable_single_vote_10k | | 91.47K | -51.68% | 0 | 0.00% | 0 | 0.00% |
| - | vote_cascading_stable_centralized_10k | | 1.38B | -52.56% | 10 | 0.00% | 0 | 0.00% |
ins = instructions, HI = heap_increase, SMI = stable_memory_increase, Δ% = percent change
---------------------------------------------------
CSV results saved to canbench_results.csv
memory-manager
---------------------------------------------------
Summary:
instructions:
status: No significant changes 👍
counts: [total 3 | regressed 0 | improved 0 | new 0 | unchanged 3]
change: [max 0 | p75 -76.96K | median -153.92K | p25 -1.66M | min -3.17M]
change %: [max 0.00% | p75 -0.01% | median -0.01% | p25 -0.46% | min -0.90%]
heap_increase:
status: No significant changes 👍
counts: [total 3 | regressed 0 | improved 0 | new 0 | unchanged 3]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
stable_memory_increase:
status: No significant changes 👍
counts: [total 3 | regressed 0 | improved 0 | new 0 | unchanged 3]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
---------------------------------------------------
CSV results saved to canbench_results.csv
vec
---------------------------------------------------
Summary:
instructions:
status: Improvements detected 🟢
counts: [total 16 | regressed 0 | improved 4 | new 0 | unchanged 12]
change: [max +102.33K | p75 +20.00K | median +20.00K | p25 -120.00K | min -8.84M]
change %: [max +1.82% | p75 +0.62% | median +0.51% | p25 -2.09% | min -50.45%]
heap_increase:
status: No significant changes 👍
counts: [total 16 | regressed 0 | improved 0 | new 0 | unchanged 16]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
stable_memory_increase:
status: No significant changes 👍
counts: [total 16 | regressed 0 | improved 0 | new 0 | unchanged 16]
change: [max 0 | p75 0 | median 0 | p25 0 | min 0]
change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]
---------------------------------------------------
Only significant changes:
| status | name | calls | ins | ins Δ% | HI | HI Δ% | SMI | SMI Δ% |
|--------|-----------------------------|-------|--------|---------|----|--------|-----|---------|
| - | vec_insert_u64 | | 5.38M | -8.35% | 0 | 0.00% | 1 | 0.00% |
| - | vec_get_u64 | | 4.79M | -9.11% | 0 | 0.00% | 0 | 0.00% |
| - | vec_get_blob_64_mem_manager | | 13.65M | -39.29% | 0 | 0.00% | 0 | 0.00% |
| - | vec_get_blob_4_mem_manager | | 7.19M | -50.45% | 0 | 0.00% | 0 | 0.00% |
ins = instructions, HI = heap_increase, SMI = stable_memory_increase, Δ% = percent change
---------------------------------------------------
CSV results saved to canbench_results.csv