Skip to content

Commit a287dc9

Browse files
committed
refactor: extract insert_into_leaf helper method
- Extract complex leaf insertion logic into dedicated helper method - Improve code readability and maintainability in insert_recursive - Add proper NodeId type import for type safety - Prepare for future arena allocation optimizations - Code formatted with cargo fmt Benefits: - Cleaner insert_recursive implementation - Better separation of concerns - Easier to profile and optimize leaf insertion logic - Foundation for addressing _platform_memmove bottleneck
1 parent 6f238a8 commit a287dc9

File tree

5 files changed

+192
-132
lines changed

5 files changed

+192
-132
lines changed

rust/src/bin/detailed_delete_profiler.rs

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,27 @@ use std::time::{Duration, Instant};
44
fn main() {
55
println!("Detailed Delete Operation Profiler");
66
println!("==================================");
7-
7+
88
// Run comprehensive delete profiling
99
profile_delete_operations_detailed();
1010
}
1111

1212
fn profile_delete_operations_detailed() {
1313
println!("\nDetailed Delete Analysis");
1414
println!("========================");
15-
15+
1616
// Test different tree sizes to understand scaling
1717
let sizes = vec![1_000, 10_000, 50_000, 100_000];
18-
18+
1919
for size in sizes {
2020
println!("\n--- Tree Size: {} elements ---", size);
2121
profile_tree_size(size);
2222
}
23-
23+
2424
// Test different capacities
2525
println!("\n--- Capacity Analysis ---");
2626
let capacities = vec![8, 16, 32, 64, 128];
27-
27+
2828
for capacity in capacities {
2929
println!("\nCapacity: {}", capacity);
3030
profile_capacity(capacity);
@@ -40,30 +40,30 @@ fn profile_tree_size(size: usize) {
4040
}
4141
tree
4242
};
43-
43+
4444
let setup_start = Instant::now();
4545
let _tree = create_tree();
4646
let setup_time = setup_start.elapsed();
47-
47+
4848
// Profile different delete patterns
4949
let delete_count = size / 4; // Delete 25% of elements
50-
50+
5151
// 1. Sequential deletes from start
5252
let mut tree1 = create_tree();
5353
let start = Instant::now();
5454
for i in 0..delete_count {
5555
tree1.remove(&(i as i32));
5656
}
5757
let sequential_time = start.elapsed();
58-
58+
5959
// 2. Sequential deletes from end
6060
let mut tree2 = create_tree();
6161
let start = Instant::now();
6262
for i in (size - delete_count)..size {
6363
tree2.remove(&(i as i32));
6464
}
6565
let reverse_time = start.elapsed();
66-
66+
6767
// 3. Middle deletes (causes most rebalancing)
6868
let mut tree3 = create_tree();
6969
let start = Instant::now();
@@ -72,7 +72,7 @@ fn profile_tree_size(size: usize) {
7272
tree3.remove(&(i as i32));
7373
}
7474
let middle_time = start.elapsed();
75-
75+
7676
// 4. Scattered deletes (every nth element)
7777
let mut tree4 = create_tree();
7878
let step = size / delete_count;
@@ -81,47 +81,70 @@ fn profile_tree_size(size: usize) {
8181
tree4.remove(&(i as i32));
8282
}
8383
let scattered_time = start.elapsed();
84-
84+
8585
println!(" Setup time: {:?}", setup_time);
86-
println!(" Sequential (start): {:?} ({:?}/op)", sequential_time, sequential_time / delete_count as u32);
87-
println!(" Sequential (end): {:?} ({:?}/op)", reverse_time, reverse_time / delete_count as u32);
88-
println!(" Middle deletes: {:?} ({:?}/op)", middle_time, middle_time / delete_count as u32);
89-
println!(" Scattered deletes: {:?} ({:?}/op)", scattered_time, scattered_time / delete_count as u32);
90-
86+
println!(
87+
" Sequential (start): {:?} ({:?}/op)",
88+
sequential_time,
89+
sequential_time / delete_count as u32
90+
);
91+
println!(
92+
" Sequential (end): {:?} ({:?}/op)",
93+
reverse_time,
94+
reverse_time / delete_count as u32
95+
);
96+
println!(
97+
" Middle deletes: {:?} ({:?}/op)",
98+
middle_time,
99+
middle_time / delete_count as u32
100+
);
101+
println!(
102+
" Scattered deletes: {:?} ({:?}/op)",
103+
scattered_time,
104+
scattered_time / delete_count as u32
105+
);
106+
91107
// Analyze which pattern is most expensive
92108
let times = vec![
93109
("Sequential (start)", sequential_time),
94110
("Sequential (end)", reverse_time),
95111
("Middle", middle_time),
96112
("Scattered", scattered_time),
97113
];
98-
114+
99115
let slowest = times.iter().max_by_key(|(_, time)| time).unwrap();
100116
let fastest = times.iter().min_by_key(|(_, time)| time).unwrap();
101-
117+
102118
println!(" Slowest: {} ({:?})", slowest.0, slowest.1);
103119
println!(" Fastest: {} ({:?})", fastest.0, fastest.1);
104-
println!(" Ratio: {:.2}x", slowest.1.as_nanos() as f64 / fastest.1.as_nanos() as f64);
120+
println!(
121+
" Ratio: {:.2}x",
122+
slowest.1.as_nanos() as f64 / fastest.1.as_nanos() as f64
123+
);
105124
}
106125

107126
fn profile_capacity(capacity: usize) {
108127
let mut tree = BPlusTreeMap::new(capacity).unwrap();
109128
let size = 50_000;
110-
129+
111130
// Pre-populate
112131
for i in 0..size {
113132
tree.insert(i, format!("value_{}", i));
114133
}
115-
134+
116135
// Delete middle section (most rebalancing)
117136
let delete_count = size / 4;
118137
let middle_start = size / 2 - delete_count / 2;
119-
138+
120139
let start = Instant::now();
121140
for i in middle_start..(middle_start + delete_count) {
122141
tree.remove(&i);
123142
}
124143
let delete_time = start.elapsed();
125-
126-
println!(" Delete time: {:?} ({:?}/op)", delete_time, delete_time / delete_count as u32);
127-
}
144+
145+
println!(
146+
" Delete time: {:?} ({:?}/op)",
147+
delete_time,
148+
delete_time / delete_count as u32
149+
);
150+
}

0 commit comments

Comments
 (0)