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}