1+ //! Performance profiling example for i32 variant query_intersecting
2+ //!
3+ //! This example performs intensive query_intersecting operations on a large spatial index
4+ //! using the i32 coordinate variant for comparison with the f64 version.
5+ //! Designed to be used with low-level profilers like `samply`:
6+ //!
7+ //! ```bash
8+ //! samply record cargo run --release --example perf_i32
9+ //! ```
10+
11+ use aabb:: HilbertRTreeI32 ;
12+ use std:: time:: Instant ;
13+
14+ fn main ( ) {
15+ println ! ( "Building large spatial index (i32 variant)..." ) ;
16+ let mut tree = HilbertRTreeI32 :: with_capacity ( 1_000_000 ) ;
17+
18+ // Generate 1 million random bounding boxes with i32 coordinates
19+ let mut rng = 12345u64 ; // Simple LCG random number generator
20+ for _ in 0 ..1_000_000 {
21+ rng = rng. wrapping_mul ( 6364136223846793005 ) . wrapping_add ( 1442695040888963407 ) ;
22+ let x1 = ( ( rng >> 32 ) as i32 ) . abs ( ) % 1000 ;
23+
24+ rng = rng. wrapping_mul ( 6364136223846793005 ) . wrapping_add ( 1442695040888963407 ) ;
25+ let y1 = ( ( rng >> 32 ) as i32 ) . abs ( ) % 1000 ;
26+
27+ rng = rng. wrapping_mul ( 6364136223846793005 ) . wrapping_add ( 1442695040888963407 ) ;
28+ let size_x = ( ( rng >> 32 ) as i32 ) . abs ( ) % 50 + 1 ;
29+
30+ rng = rng. wrapping_mul ( 6364136223846793005 ) . wrapping_add ( 1442695040888963407 ) ;
31+ let size_y = ( ( rng >> 32 ) as i32 ) . abs ( ) % 50 + 1 ;
32+
33+ tree. add ( x1, y1, x1 + size_x, y1 + size_y) ;
34+ }
35+
36+ let build_start = Instant :: now ( ) ;
37+ tree. build ( ) ;
38+ let build_duration = build_start. elapsed ( ) ;
39+
40+ let mut results = Vec :: new ( ) ;
41+ let query_start = Instant :: now ( ) ;
42+
43+ // Perform 100,000 intensive queries for profiling
44+ // Each query covers approximately 10% of the space
45+ for _ in 0 ..100_000 {
46+ rng = rng. wrapping_mul ( 6364136223846793005 ) . wrapping_add ( 1442695040888963407 ) ;
47+ let center_x = ( ( rng >> 32 ) as i32 ) . abs ( ) % 1000 ;
48+
49+ rng = rng. wrapping_mul ( 6364136223846793005 ) . wrapping_add ( 1442695040888963407 ) ;
50+ let center_y = ( ( rng >> 32 ) as i32 ) . abs ( ) % 1000 ;
51+
52+ let query_size = 100 ; // 10% of space
53+ let min_x = ( center_x - query_size / 2 ) . max ( 0 ) ;
54+ let min_y = ( center_y - query_size / 2 ) . max ( 0 ) ;
55+ let max_x = ( center_x + query_size / 2 ) . min ( 1000 ) ;
56+ let max_y = ( center_y + query_size / 2 ) . min ( 1000 ) ;
57+
58+ tree. query_intersecting ( min_x, min_y, max_x, max_y, & mut results) ;
59+ }
60+
61+ let query_duration = query_start. elapsed ( ) ;
62+
63+ println ! (
64+ "\n Completed 100,000 queries in {:.2}ms ({:.2}µs per query)" ,
65+ query_duration. as_secs_f64( ) * 1000.0 ,
66+ query_duration. as_secs_f64( ) * 1_000_000.0 / 100_000.0
67+ ) ;
68+
69+ println ! ( "\n Profile Summary (i32 variant):" ) ;
70+ println ! ( " Building: {:.2}ms" , build_duration. as_secs_f64( ) * 1000.0 ) ;
71+ println ! ( " Querying: {:.2}ms" , query_duration. as_secs_f64( ) * 1000.0 ) ;
72+ println ! ( " Total: {:.2}ms" , ( build_duration + query_duration) . as_secs_f64( ) * 1000.0 ) ;
73+ }
74+
75+
76+ /*
77+ Base
78+ Completed 100,000 queries in 11622.38ms (116.22µs per query)
79+
80+ Profile Summary (i32 variant):
81+ Building: 96.11ms
82+ Querying: 11622.38ms
83+ Total: 11718.49ms
84+
85+ */
0 commit comments