Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
574aaf4
Implement `entry` for `BTreeMap` similar to std lib
hpeebles Mar 26, 2026
f6d06fb
clippy
hpeebles Mar 26, 2026
b620979
Add doc comments
hpeebles Mar 27, 2026
4e92c92
Remove 2 debug asserts which I added but are overly restrictive
hpeebles Mar 27, 2026
ded3088
Only apply restriction to Leaf nodes
hpeebles Mar 27, 2026
1b1f247
Use `debug_assert_eq` rather than `debug_assert`
hpeebles Mar 27, 2026
787ff04
Add proptests
hpeebles Mar 27, 2026
68f4f81
Add more functionality
hpeebles Mar 31, 2026
29f86a3
Get the AI to polish it up
hpeebles Mar 31, 2026
d313e66
Return `LazyValue` to avoid deserialization if not reading value
hpeebles Mar 31, 2026
ca48b9a
Update proptests
hpeebles Mar 31, 2026
0d1bbd4
clippy
hpeebles Mar 31, 2026
fdf8571
Improve doc comments
hpeebles Mar 31, 2026
51f4a84
s -> z
hpeebles Mar 31, 2026
bb7a881
Merge branch 'main' of https://github.com/dfinity/stable-structures
hpeebles Apr 1, 2026
63c7c58
Revert `insert` back to how it was since "find node -> insert" is slower
hpeebles Apr 1, 2026
13f74c3
Remove these
hpeebles Apr 1, 2026
f0a56ce
Deduplicate by passing callback into `find_node_for_insert`
hpeebles Apr 1, 2026
f219ecd
Merge branch 'main' of https://github.com/dfinity/stable-structures
hpeebles May 10, 2026
c4ac0a5
perf: use the node cache in the entry API
hpeebles Jul 24, 2026
a80fb27
test: add canbench baselines for the entry benchmarks
hpeebles Jul 24, 2026
05c3ade
fix(btreemap): report the stored key from `OccupiedEntry::key`
hpeebles Jul 25, 2026
0caf2bb
docs(btreemap): document that `entry` writes to stable memory
hpeebles Jul 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions benchmarks/btreemap/canbench_results.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
benches:
btreemap_get_and_incr:
total:
calls: 1
instructions: 376179070
heap_increase: 0
stable_memory_increase: 0
scopes: {}
btreemap_get_and_incr_via_entry:
total:
calls: 1
instructions: 317352818
heap_increase: 0
stable_memory_increase: 0
scopes: {}
btreemap_v2_contains_10mib_values:
total:
calls: 1
Expand Down
40 changes: 40 additions & 0 deletions benchmarks/btreemap/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use benchmarks::{random::Random, vec::UnboundedVecN};
use canbench_rs::{bench, bench_fn, BenchResult};
use candid::Principal;
use ic_stable_structures::btreemap::entry::Entry::Occupied;
use ic_stable_structures::memory_manager::{MemoryId, MemoryManager};
use ic_stable_structures::{storable::Blob, BTreeMap, DefaultMemoryImpl, Memory, Storable};
use std::ops::Bound;
Expand Down Expand Up @@ -441,6 +442,45 @@ pub fn btreemap_v2_get_10mib_values() -> BenchResult {
})
}

#[bench(raw)]
pub fn btreemap_get_and_incr() -> BenchResult {
let count = 10000;
let mut btree = BTreeMap::new(DefaultMemoryImpl::default());
let mut rng = Rng::from_seed(0);
let values = generate_random_kv::<u64, u64>(count, &mut rng);
for (key, value) in values.iter().copied() {
btree.insert(key, value);
}

bench_fn(|| {
for (key, _) in values {
let existing = btree.get(&key).unwrap();
btree.insert(key, existing + 1);
}
})
}

#[bench(raw)]
pub fn btreemap_get_and_incr_via_entry() -> BenchResult {
let count = 10000;
let mut btree = BTreeMap::new(DefaultMemoryImpl::default());
let mut rng = Rng::from_seed(0);
let values = generate_random_kv::<u64, u64>(count, &mut rng);
for (key, value) in values.iter().copied() {
btree.insert(key, value);
}

bench_fn(|| {
for (key, _) in values {
let Occupied(e) = btree.entry(key) else {
panic!()
};
let existing = e.get();
e.insert(existing + 1);
}
})
}

// Benchmarks for `BTreeMap::contains_key`.
// Reduced grid: contains_key traversal is identical to get, only skips value deserialization.
bench_tests! {
Expand Down
Loading
Loading