@@ -4,27 +4,27 @@ use std::time::{Duration, Instant};
44fn main ( ) {
55 println ! ( "Detailed Delete Operation Profiler" ) ;
66 println ! ( "==================================" ) ;
7-
7+
88 // Run comprehensive delete profiling
99 profile_delete_operations_detailed ( ) ;
1010}
1111
1212fn profile_delete_operations_detailed ( ) {
1313 println ! ( "\n Detailed 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 ! ( "\n Capacity: {}" , 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
107126fn 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