| 7 | /// Simple baseline benchmark using direct DbHandler calls |
| 8 | #[tokio::test] |
| 9 | async fn benchmark_single_thread_baseline() { |
| 10 | eprintln!("\n=== Single Thread Baseline Benchmark ==="); |
| 11 | |
| 12 | let db_handler = Arc::new(DbHandler::new(":memory:").unwrap()); |
| 13 | |
| 14 | // Setup test data |
| 15 | db_handler.execute(" |
| 16 | CREATE TABLE baseline_test ( |
| 17 | id INTEGER PRIMARY KEY, |
| 18 | name TEXT, |
| 19 | value INTEGER |
| 20 | ) |
| 21 | ").await.expect("Failed to create table"); |
| 22 | |
| 23 | for i in 0..1000 { |
| 24 | db_handler.execute(&format!( |
| 25 | "INSERT INTO baseline_test (id, name, value) VALUES ({}, 'name_{}', {})", |
| 26 | i, i, i * 10 |
| 27 | )).await.expect("Failed to insert"); |
| 28 | } |
| 29 | |
| 30 | eprintln!("Data setup complete: 1,000 rows"); |
| 31 | |
| 32 | // Benchmark queries |
| 33 | let iterations = 100; |
| 34 | let mut query_times = Vec::new(); |
| 35 | |
| 36 | let start_time = Instant::now(); |
| 37 | |
| 38 | for i in 0..iterations { |
| 39 | let query_start = Instant::now(); |
| 40 | let id = i % 1000; |
| 41 | |
| 42 | let result = db_handler.query( |
| 43 | &format!("SELECT * FROM baseline_test WHERE id = {}", id) |
| 44 | ).await.expect("Query failed"); |
| 45 | |
| 46 | assert!(!result.rows.is_empty()); |
| 47 | query_times.push(query_start.elapsed()); |
| 48 | } |
| 49 | |
| 50 | let total_duration = start_time.elapsed(); |
| 51 | let qps = iterations as f64 / total_duration.as_secs_f64(); |
| 52 | |
| 53 | // Calculate statistics |
| 54 | query_times.sort(); |
| 55 | let avg = query_times.iter().sum::<Duration>() / query_times.len() as u32; |
| 56 | let min = query_times[0]; |
| 57 | let max = query_times[query_times.len() - 1]; |
| 58 | let p50 = query_times[query_times.len() / 2]; |
| 59 | let p95 = query_times[query_times.len() * 95 / 100]; |
| 60 | |
| 61 | eprintln!("\nDirect DbHandler Baseline Results:"); |
| 62 | eprintln!(" Iterations: {}", iterations); |
| 63 | eprintln!(" Duration: {:.3}s", total_duration.as_secs_f64()); |
| 64 | eprintln!(" QPS: {:.1}", qps); |
| 65 | eprintln!(" Latency (avg): {:.3}ms", avg.as_secs_f64() * 1000.0); |
| 66 | eprintln!(" Latency (min): {:.3}ms", min.as_secs_f64() * 1000.0); |