#![allow(clippy::inconsistent_digit_grouping, dead_code, unused_variables)] //! Performance benchmarks for DBN data loading //! //! This benchmark measures the performance of loading real market data from DBN files //! to ensure it meets HFT requirements. use backtesting_service::dbn_repository::DbnMarketDataRepository; use backtesting_service::repositories::MarketDataRepository; use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; use std::collections::HashMap; use tokio::runtime::Runtime; fn benchmark_dbn_loading(c: &mut Criterion) { let rt = Runtime::new().unwrap(); // Find workspace root to get absolute path to test file let current_dir = std::env::current_dir().expect("INVARIANT: Current directory should be accessible"); let workspace_root = current_dir .ancestors() .find(|p| p.join("Cargo.toml").exists() && p.join("test_data").exists()) .expect("Could not find workspace root"); let test_file = workspace_root.join("test_data/real/databento/ES.FUT_ohlcv-1m_2024-01-02.dbn"); if !test_file.exists() { panic!("Test file not found: {}", test_file.display()); } let mut file_mapping = HashMap::new(); file_mapping.insert( "ES.FUT".to_string(), test_file.to_string_lossy().to_string(), ); let repo = rt.block_on(async { DbnMarketDataRepository::new(file_mapping).await.unwrap() }); c.bench_function("load_es_fut_390_bars", |b| { b.to_async(&rt).iter(|| async { let symbols = vec!["ES.FUT".to_string()]; let start_time = 1704153600_000_000_000i64; // 2024-01-02 00:00:00 let end_time = 1704240000_000_000_000i64; // 2024-01-03 00:00:00 let data = repo .load_historical_data(&symbols, start_time, end_time) .await .unwrap(); black_box(data); }); }); } fn benchmark_multiple_loads(c: &mut Criterion) { let rt = Runtime::new().unwrap(); // Find workspace root to get absolute path to test file let current_dir = std::env::current_dir().expect("INVARIANT: Current directory should be accessible"); let workspace_root = current_dir .ancestors() .find(|p| p.join("Cargo.toml").exists() && p.join("test_data").exists()) .expect("Could not find workspace root"); let test_file = workspace_root.join("test_data/real/databento/ES.FUT_ohlcv-1m_2024-01-02.dbn"); let mut file_mapping = HashMap::new(); file_mapping.insert( "ES.FUT".to_string(), test_file.to_string_lossy().to_string(), ); let repo = rt.block_on(async { DbnMarketDataRepository::new(file_mapping).await.unwrap() }); let mut group = c.benchmark_group("multiple_loads"); for iterations in [1, 5, 10].iter() { group.bench_with_input( BenchmarkId::from_parameter(iterations), iterations, |b, &iterations| { b.to_async(&rt).iter(|| async { for _ in 0..iterations { let symbols = vec!["ES.FUT".to_string()]; let start_time = 1704153600_000_000_000i64; let end_time = 1704240000_000_000_000i64; let data = repo .load_historical_data(&symbols, start_time, end_time) .await .unwrap(); black_box(data); } }); }, ); } group.finish(); } fn benchmark_partial_day_load(c: &mut Criterion) { let rt = Runtime::new().unwrap(); // Find workspace root to get absolute path to test file let current_dir = std::env::current_dir().expect("INVARIANT: Current directory should be accessible"); let workspace_root = current_dir .ancestors() .find(|p| p.join("Cargo.toml").exists() && p.join("test_data").exists()) .expect("Could not find workspace root"); let test_file = workspace_root.join("test_data/real/databento/ES.FUT_ohlcv-1m_2024-01-02.dbn"); let mut file_mapping = HashMap::new(); file_mapping.insert( "ES.FUT".to_string(), test_file.to_string_lossy().to_string(), ); let repo = rt.block_on(async { DbnMarketDataRepository::new(file_mapping).await.unwrap() }); c.bench_function("load_es_fut_partial_day", |b| { b.to_async(&rt).iter(|| async { let symbols = vec!["ES.FUT".to_string()]; // Load only first 4 hours (9:30 AM - 1:30 PM ET) let start_time = 1704203400_000_000_000i64; // 2024-01-02 09:30:00 ET let end_time = 1704217800_000_000_000i64; // 2024-01-02 13:30:00 ET let data = repo .load_historical_data(&symbols, start_time, end_time) .await .unwrap(); black_box(data); }); }); } criterion_group!( benches, benchmark_dbn_loading, benchmark_multiple_loads, benchmark_partial_day_load ); criterion_main!(benches);