mixvideo-v2/apps/desktop/src-tauri/src/infrastructure/performance.rs

189 lines
5.7 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// 性能监控系统
/// 遵循 Tauri 开发规范的性能优化原则
use std::time::{Duration, Instant};
use std::collections::HashMap;
use serde::{Serialize, Deserialize};
/// 性能指标结构
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceMetric {
pub name: String,
pub current_value: f64,
pub average_value: f64,
pub max_value: f64,
pub min_value: f64,
pub sample_count: u64,
pub last_updated: std::time::SystemTime,
}
/// 性能监控器
/// 遵循 Tauri 开发规范的性能标准:
/// - 应用启动时间≤3秒
/// - 内存占用≤100MB空闲状态
/// - CPU使用率≤5%(空闲状态)
/// - 响应时间≤100msUI交互
pub struct PerformanceMonitor {
metrics: HashMap<String, PerformanceMetric>,
startup_time: Instant,
}
impl PerformanceMonitor {
/// 创建新的性能监控器
pub fn new() -> Self {
Self {
metrics: HashMap::new(),
startup_time: Instant::now(),
}
}
/// 记录性能指标
/// 遵循性能监控的最佳实践
pub fn record_metric(&mut self, name: &str, value: f64) {
let metric = self.metrics.entry(name.to_string()).or_insert_with(|| {
PerformanceMetric {
name: name.to_string(),
current_value: value,
average_value: value,
max_value: value,
min_value: value,
sample_count: 0,
last_updated: std::time::SystemTime::now(),
}
});
metric.current_value = value;
metric.max_value = metric.max_value.max(value);
metric.min_value = metric.min_value.min(value);
metric.sample_count += 1;
metric.average_value = (metric.average_value * (metric.sample_count - 1) as f64 + value)
/ metric.sample_count as f64;
metric.last_updated = std::time::SystemTime::now();
}
/// 获取性能指标
pub fn get_metric(&self, name: &str) -> Option<&PerformanceMetric> {
self.metrics.get(name)
}
/// 获取启动时间
pub fn get_startup_time(&self) -> Duration {
self.startup_time.elapsed()
}
/// 获取所有性能指标
pub fn get_all_metrics(&self) -> &HashMap<String, PerformanceMetric> {
&self.metrics
}
/// 检查性能是否符合 Tauri 开发规范标准
pub fn check_performance_standards(&self) -> PerformanceReport {
let mut report = PerformanceReport {
startup_time_ok: true,
memory_usage_ok: true,
cpu_usage_ok: true,
response_time_ok: true,
issues: Vec::new(),
};
// 检查启动时间≤3秒
if self.get_startup_time() > Duration::from_secs(3) {
report.startup_time_ok = false;
report.issues.push("启动时间超过3秒标准".to_string());
}
// 检查内存使用≤100MB
if let Some(memory_metric) = self.get_metric("memory_usage_mb") {
if memory_metric.current_value > 100.0 {
report.memory_usage_ok = false;
report.issues.push("内存使用超过100MB标准".to_string());
}
}
// 检查CPU使用率≤5%
if let Some(cpu_metric) = self.get_metric("cpu_usage_percent") {
if cpu_metric.current_value > 5.0 {
report.cpu_usage_ok = false;
report.issues.push("CPU使用率超过5%标准".to_string());
}
}
// 检查响应时间≤100ms
if let Some(response_metric) = self.get_metric("response_time_ms") {
if response_metric.current_value > 100.0 {
report.response_time_ok = false;
report.issues.push("响应时间超过100ms标准".to_string());
}
}
report
}
}
/// 性能报告
#[derive(Debug, Serialize, Deserialize)]
pub struct PerformanceReport {
pub startup_time_ok: bool,
pub memory_usage_ok: bool,
pub cpu_usage_ok: bool,
pub response_time_ok: bool,
pub issues: Vec<String>,
}
impl Default for PerformanceMonitor {
fn default() -> Self {
Self::new()
}
}
/// 性能监控宏
/// 用于简化性能监控的使用
#[macro_export]
macro_rules! measure_performance {
($monitor:expr, $name:expr, $code:block) => {
{
let start = std::time::Instant::now();
let result = $code;
let duration = start.elapsed();
$monitor.record_metric($name, duration.as_millis() as f64);
result
}
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_performance_monitor() {
let mut monitor = PerformanceMonitor::new();
// 测试记录指标
monitor.record_metric("test_metric", 50.0);
monitor.record_metric("test_metric", 75.0);
let metric = monitor.get_metric("test_metric").unwrap();
assert_eq!(metric.sample_count, 2);
assert_eq!(metric.current_value, 75.0);
assert_eq!(metric.max_value, 75.0);
assert_eq!(metric.min_value, 50.0);
assert_eq!(metric.average_value, 62.5);
}
#[test]
fn test_performance_standards() {
let mut monitor = PerformanceMonitor::new();
// 模拟符合标准的性能指标
monitor.record_metric("memory_usage_mb", 80.0);
monitor.record_metric("cpu_usage_percent", 3.0);
monitor.record_metric("response_time_ms", 50.0);
let report = monitor.check_performance_standards();
assert!(report.memory_usage_ok);
assert!(report.cpu_usage_ok);
assert!(report.response_time_ok);
assert!(report.issues.is_empty());
}
}