Skip to main content

sz_orm_core/
benchmark.rs

1//! # Benchmark 回归对比结构(`benchmark-suite` feature)
2//!
3//! 定义 `BenchPath` enum、`BaselinePoint`/`RegressionPoint`/`RegressionReport` 结构,
4//! 用于 M2-T2 回归基准线对比。
5
6use serde::{Deserialize, Serialize};
7
8/// 六大核心基准路径
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
10pub enum BenchPath {
11    /// 路径 1:查询构造
12    QueryBuild,
13    /// 路径 2:连接池
14    Pool,
15    /// 路径 3:缓存
16    Cache,
17    /// 路径 4:事务
18    Transaction,
19    /// 路径 5:序列化
20    Serialization,
21    /// 路径 6:流式查询
22    Stream,
23}
24
25/// 基准线数据点
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct BaselinePoint {
28    /// 基准路径
29    pub path: BenchPath,
30    /// 基准点名称
31    pub name: String,
32    /// 均值(纳秒)
33    pub mean_ns: f64,
34    /// 标准差(纳秒)
35    pub stddev_ns: f64,
36    /// P99 延迟(纳秒)
37    pub p99_ns: f64,
38    /// 采集时间戳(Unix epoch 秒)
39    pub timestamp: u64,
40}
41
42/// 回归对比数据点
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct RegressionPoint {
45    /// 基准路径
46    pub path: BenchPath,
47    /// 基准点名称
48    pub name: String,
49    /// 当前均值(纳秒)
50    pub current_mean_ns: f64,
51    /// 基线均值(纳秒)
52    pub baseline_mean_ns: f64,
53    /// 变化百分比(正数=回退,负数=改善)
54    pub change_percent: f64,
55    /// 是否标记为回退(≥10% 变化)
56    pub is_regression: bool,
57}
58
59/// 回归报告
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct RegressionReport {
62    /// 报告生成时间戳
63    pub timestamp: u64,
64    /// 所有对比数据点
65    pub points: Vec<RegressionPoint>,
66    /// 回退数据点数量
67    pub regression_count: usize,
68    /// 改善数据点数量
69    pub improvement_count: usize,
70}
71
72impl RegressionReport {
73    /// 从对比点列表生成报告
74    pub fn from_points(points: Vec<RegressionPoint>) -> Self {
75        let regression_count = points
76            .iter()
77            .filter(|p| p.is_regression && p.change_percent > 0.0)
78            .count();
79        let improvement_count = points.iter().filter(|p| p.change_percent < 0.0).count();
80        Self {
81            timestamp: std::time::SystemTime::now()
82                .duration_since(std::time::UNIX_EPOCH)
83                .unwrap_or_default()
84                .as_secs(),
85            points,
86            regression_count,
87            improvement_count,
88        }
89    }
90}
91
92/// 计算变化百分比并判断是否为回退(≥10%)
93pub fn compute_change(current: f64, baseline: f64) -> (f64, bool) {
94    if baseline == 0.0 {
95        return (0.0, false);
96    }
97    let change_percent = ((current - baseline) / baseline) * 100.0;
98    let is_regression = change_percent.abs() >= 10.0;
99    (change_percent, is_regression)
100}