Skip to content

v0.7.0

Latest
Compare
Choose a tag to compare
@maksymar maksymar released this 18 Jul 08:32
0dc72fa

Highlights

  • Faster BTreeMap: Fewer clones via into_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 return Result — 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 over entry objects and use entry.key() and entry.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
  • Docs
  • CI & chores

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