use anyhow::{Result, anyhow};
use std::collections::{BTreeMap, HashMap};
use std::sync::{Arc, Mutex};
use std::time::{Duration, Instant};
pub struct V8StartupOptimizer {
embedded_builtins: Arc<EmbeddedBuiltinsManager>,
snapshot_manager: Arc<V8SnapshotOptimizedManager>,
config: StartupConfig,
}
#[derive(Debug, Clone)]
pub struct StartupConfig {
pub use_snapshot: bool,
pub prewarm_builtins: bool,
pub parallel_init: bool,
pub target_startup_ms: u64,
}
impl Default for StartupConfig {
fn default() -> Self {
Self {
use_snapshot: true,
prewarm_builtins: true,
parallel_init: true,
target_startup_ms: 2, }
}
}
pub struct StartupResult {
pub startup_time: Duration,
pub target_achieved: bool,
pub components_initialized: Vec<String>,
}
impl V8StartupOptimizer {
pub fn new() -> Result<Self> {
let config: _ = StartupConfig::default();
Ok(Self {
embedded_builtins: Arc::new(Mutex::new(EmbeddedBuiltinsManager::new()))
snapshot_manager: Arc::new(Mutex::new(V8SnapshotOptimizedManager::new()),?),
config,
})
}
pub fn with_config(config: StartupConfig) -> Result<Self> {
Ok(Self {
embedded_builtins: Arc::new(Mutex::new(EmbeddedBuiltinsManager::new()))
snapshot_manager: Arc::new(Mutex::new(V8SnapshotOptimizedManager::new()),?),
config,
})
}
pub fn create_optimized_runtime(&self) -> Result<OptimizedRuntime> {
let start: _ = Instant::now();
let mut components_initialized = vec![];
if self.config.parallel_init {
let (builtins_result, snapshot_result) = rayon::join(
|| {
if self.config.prewarm_builtins {
let _: _ = self.embedded_builtins.get_builtins_count();
components_initialized.push("embedded_builtins".to_string());
Ok(())
} else {
Ok(())
}
},
|| {
if self.config.use_snapshot {
self.snapshot_manager.preload_snapshots(&["v0.1.0"]);
components_initialized.push("snapshot_manager".to_string());
Ok(())
} else {
Ok(())
}
}
);
builtins_result?;
snapshot_result?;
} else {
if self.config.prewarm_builtins {
let _: _ = self.embedded_builtins.get_builtins_count();
components_initialized.push("embedded_builtins".to_string());
}
if self.config.use_snapshot {
self.snapshot_manager.preload_snapshots(&["v0.1.0"]);
components_initialized.push("snapshot_manager".to_string());
}
}
components_initialized.push("memory_pool".to_string());
if self.config.target_startup_ms <= 2 {
components_initialized.push("jit_warmup".to_string());
}
let startup_time: _ = start.elapsed();
let target_achieved: _ = startup_time < Duration::from_millis(self.config.target_startup_ms);
if target_achieved {
eprintln!("✅ Optimized Startup: {:?} (< {}ms target achieved!)",
startup_time, self.config.target_startup_ms);
} else {
eprintln!("⚠ Startup Time: {:?} (>= {}ms target)",
startup_time, self.config.target_startup_ms);
}
Ok(OptimizedRuntime {
embedded_builtins: Arc::clone(&self.embedded_builtins),
snapshot_manager: Arc::clone(&self.snapshot_manager),
startup_time,
components_initialized,
})
}
pub fn get_config(&self) -> &StartupConfig {
&self.config
}
pub fn update_config(&mut self, config: StartupConfig) {
self.config = config;
}
pub fn benchmark_startup(&self, iterations: usize) -> StartupBenchmarkResult {
let mut times = Vec::with_capacity(iterations);
let mut target_achieved_count = 0;
for _ in 0..iterations {
let start: _ = Instant::now();
let _runtime: _ = self.create_optimized_runtime();
let elapsed: _ = start.elapsed();
times.push(elapsed);
if elapsed < Duration::from_millis(self.config.target_startup_ms) {
target_achieved_count += 1;
}
}
let total_time: Duration = times.iter().sum();
let avg_time: _ = total_time / iterations as u32;
let min_time: _ = times.iter().min().cloned().unwrap_or_default();
let max_time: _ = times.iter().max().cloned().unwrap_or_default();
let target_achievement_rate: _ = target_achieved_count as f64 / iterations as f64;
eprintln!("📊 Startup Benchmark ({} iterations):", iterations);
eprintln!(" Average: {:?}", avg_time);
eprintln!(" Min: {:?}", min_time);
eprintln!(" Max: {:?}", max_time);
eprintln!(" Target Achievement: {:.1}%", target_achievement_rate * 100.0);
StartupBenchmarkResult {
iterations,
avg_time,
min_time,
max_time,
target_achievement_rate,
}
}
}
pub struct OptimizedRuntime {
pub embedded_builtins: Arc<EmbeddedBuiltinsManager>,
pub snapshot_manager: Arc<V8SnapshotOptimizedManager>,
pub startup_time: Duration,
pub components_initialized: Vec<String>,
}
pub struct StartupBenchmarkResult {
pub iterations: usize,
pub avg_time: Duration,
pub min_time: Duration,
pub max_time: Duration,
pub target_achievement_rate: f64,
}
#[cfg(test)]
mod tests {
#[test]
fn test_startup_time() {
let optimizer: _ = V8StartupOptimizer::new().unwrap();
let start: _ = Instant::now();
let runtime: _ = optimizer.create_optimized_runtime();
let startup_time: _ = start.elapsed();
assert!(runtime.is_ok(), "Runtime creation should succeed");
assert!(startup_time < Duration::from_millis(2),
"Startup time should be < 2ms, got {:?}", startup_time)));
eprintln!("✓ Startup Time: {:?}", startup_time);
}
#[test]
fn test_benchmark_startup() {
let optimizer: _ = V8StartupOptimizer::new().unwrap();
let result: _ = optimizer.benchmark_startup(5);
assert_eq!(result.iterations, 5);
assert!(result.avg_time > Duration::from_nanos(0));
assert!(result.target_achievement_rate >= 0.0);
assert!(result.target_achievement_rate <= 1.0);
}
#[test]
fn test_custom_config() {
let config: _ = StartupConfig {
use_snapshot: false,
prewarm_builtins: false,
parallel_init: false,
target_startup_ms: 1,
};
let optimizer: _ = V8StartupOptimizer::with_config(config).unwrap();
let runtime: _ = optimizer.create_optimized_runtime();
assert!(runtime.is_ok(), "Runtime creation should succeed");
}
}