Skip to content

Commit 2579371

Browse files
committed
Perf: preallocate node vectors to capacity; drop merge-time reserves. Keeps capacity invariant while avoiding reallocs; validated tests + large delete bench.
1 parent c912058 commit 2579371

3 files changed

Lines changed: 6 additions & 27 deletions

File tree

rust/src/construction.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,11 @@ impl<K, V> LeafNode<K, V> {
122122
/// // Leaf node created successfully
123123
/// ```
124124
pub fn new(capacity: usize) -> Self {
125+
// Pre-allocate to capacity to avoid reallocations during steady-state ops
125126
Self {
126127
capacity,
127-
keys: Vec::new(),
128-
values: Vec::new(),
128+
keys: Vec::with_capacity(capacity),
129+
values: Vec::with_capacity(capacity),
129130
next: NULL_NODE,
130131
}
131132
}
@@ -187,10 +188,11 @@ impl<K, V> BranchNode<K, V> {
187188
/// // Branch node created successfully
188189
/// ```
189190
pub fn new(capacity: usize) -> Self {
191+
// Pre-allocate: keys up to capacity, children up to capacity+1
190192
Self {
191193
capacity,
192-
keys: Vec::new(),
193-
children: Vec::new(),
194+
keys: Vec::with_capacity(capacity),
195+
children: Vec::with_capacity(capacity + 1),
194196
}
195197
}
196198

rust/src/delete_operations.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -462,9 +462,6 @@ impl<K: Ord + Clone, V: Clone> BPlusTreeMap<K, V> {
462462
let Some(left_branch) = self.get_branch_mut(left_id) else {
463463
return false;
464464
};
465-
let add_keys = 1 + child_keys.len(); // separator + child keys
466-
let add_children = child_children.len();
467-
left_branch.reserve_for_merge(add_keys, add_children);
468465
left_branch.keys.push(separator_key);
469466
left_branch.keys.append(&mut child_keys);
470467
left_branch.children.append(&mut child_children);
@@ -518,9 +515,6 @@ impl<K: Ord + Clone, V: Clone> BPlusTreeMap<K, V> {
518515
let Some(child_branch) = self.get_branch_mut(child_id) else {
519516
return false;
520517
};
521-
let add_keys = 1 + right_keys.len(); // separator + right keys
522-
let add_children = right_children.len();
523-
child_branch.reserve_for_merge(add_keys, add_children);
524518
child_branch.keys.push(separator_key);
525519
child_branch.keys.append(&mut right_keys);
526520
child_branch.children.append(&mut right_children);
@@ -735,8 +729,6 @@ impl<K: Ord + Clone, V: Clone> BPlusTreeMap<K, V> {
735729

736730
// Merge into left leaf and update linked list - reserve to avoid reallocations
737731
let Some(left_leaf) = self.get_leaf_mut(left_id) else { return false; };
738-
let add = child_keys.len();
739-
left_leaf.reserve_for_merge(add);
740732
left_leaf.append_keys(&mut child_keys);
741733
left_leaf.append_values(&mut child_values);
742734
left_leaf.next = child_next;
@@ -788,8 +780,6 @@ impl<K: Ord + Clone, V: Clone> BPlusTreeMap<K, V> {
788780

789781
// Then merge into child, reserving capacity to avoid reallocations
790782
let Some(child_leaf) = self.get_leaf_mut(child_id) else { return false; };
791-
let add = right_keys.len();
792-
child_leaf.reserve_for_merge(add);
793783
child_leaf.append_keys(&mut right_keys);
794784
child_leaf.append_values(&mut right_values);
795785
child_leaf.next = right_next;

rust/src/node.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,6 @@ impl<K: Ord + Clone, V: Clone> LeafNode<K, V> {
226226
self.values.append(other);
227227
}
228228

229-
/// Reserve capacity for an incoming merge of `additional` items.
230-
#[inline]
231-
pub fn reserve_for_merge(&mut self, additional: usize) {
232-
// Reserve for both keys and values (kept in lockstep)
233-
self.keys.reserve(additional);
234-
self.values.reserve(additional);
235-
}
236229

237230
/// Take all keys, leaving an empty vector.
238231
#[inline]
@@ -723,10 +716,4 @@ impl<K: Ord + Clone, V: Clone> BranchNode<K, V> {
723716
self.children.append(&mut other.children);
724717
}
725718

726-
/// Reserve capacity for an incoming merge.
727-
#[inline]
728-
pub fn reserve_for_merge(&mut self, additional_keys: usize, additional_children: usize) {
729-
self.keys.reserve(additional_keys);
730-
self.children.reserve(additional_children);
731-
}
732719
}

0 commit comments

Comments
 (0)