next_web_utils/common/
bencher.rs

1/// 定义一个 `QPS` trait,用于计算每秒查询数(QPS)、操作耗时以及总耗时。
2pub trait QPS {
3    /// 计算并打印每秒查询数(QPS)。
4    ///
5    /// # 参数
6    /// - `total`: 总操作次数。
7    fn qps(&self, total: u64);
8
9    /// 计算并打印总耗时以及每次操作的平均耗时。
10    ///
11    /// # 参数
12    /// - `total`: 总操作次数。
13    fn time(&self, total: u64);
14
15    /// 打印从某个时间点到当前的总耗时。
16    fn cost(&self);
17}
18
19/// 为 `std::time::Instant` 实现 `QPS` trait。
20impl QPS for std::time::Instant {
21    /// 计算并打印每秒查询数(QPS)。
22    ///
23    /// # 参数
24    /// - `total`: 总操作次数。
25    ///
26    /// # 实现细节
27    /// 使用 `elapsed()` 方法获取从 `Instant` 创建到当前的时间间隔,并根据公式计算 QPS:
28    fn qps(&self, total: u64) {
29        let time = self.elapsed(); // 获取从 `Instant` 创建到当前的时间间隔 <button class="citation-flag" data-index="5">
30        println!(
31            "use QPS: {} QPS/s",
32            (total as u128 * 1000000000 as u128 / time.as_nanos() as u128)
33        );
34    }
35
36    /// 计算并打印总耗时以及每次操作的平均耗时。
37    ///
38    /// # 参数
39    /// - `total`: 总操作次数。
40    ///
41    /// # 实现细节
42    /// 使用 `elapsed()` 方法获取总耗时,并计算每次操作的平均耗时(单位:纳秒)。
43    fn time(&self, total: u64) {
44        let time = self.elapsed(); // 获取从 `Instant` 创建到当前的时间间隔 <button class="citation-flag" data-index="5">
45        println!(
46            "use Time: {:?} ,each:{} ns/op",
47            &time,
48            time.as_nanos() / (total as u128)
49        );
50    }
51
52    /// 打印从某个时间点到当前的总耗时。
53    ///
54    /// # 实现细节
55    /// 使用 `elapsed()` 方法获取从 `Instant` 创建到当前的时间间隔,并直接打印。
56    fn cost(&self) {
57        let time = self.elapsed(); // 获取从 `Instant` 创建到当前的时间间隔 <button class="citation-flag" data-index="5">
58        println!("cost:{:?}", time);
59    }
60}
61
62/// 单元测试模块,用于验证 `QPS` trait 的功能。
63#[cfg(test)]
64mod qps_test {
65
66    use std::time::Instant;
67
68    use super::QPS;
69
70    /// 测试 `qps` 方法。
71    ///
72    /// # 测试内容
73    /// 创建一个 `Instant` 对象,执行 1,000,000 次简单的数学运算,然后调用 `qps` 方法计算并打印 QPS。
74    #[test]
75    fn test_qps() {
76        let now = Instant::now(); // 创建一个时间点 <button class="citation-flag" data-index="5">
77        for i in 0..1000000 {
78            let _ = i * 10; // 执行简单的数学运算以模拟工作负载
79        }
80        now.qps(1000000); // 调用 `qps` 方法,传入总操作次数
81    }
82}