利用 RAII 机制实现一个记录程序耗时的类
在开发过程中,有时候需要测试某个函数或者代码片段的耗时情况,所以我使用 RAII 机制实现一个记录程序耗时的类。
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// c++ 中提供了一个计时的模板 std::chrono, 里面有三种时钟: steady_clock, system_clock 和 high_resolution_clock。
// steady_clock 类似秒表, 适合用于记录程序耗时;
// system_clock 是系统的时钟, 因为系统的时钟可以修改, 甚至可以网络对时, 所以用系统时间计算时间差可能不准。
// high_resolution_clock 是当前系统能够提供的最高精度的时钟, 它也是不可以修改的, 相当于 steady_clock 的高精度版本。
#include <chrono>
#include <iostream>
#include <string>
class Timer
{
private:
std::string tag_;
Unit unit_;
const std::chrono::time_point<std::chrono::high_resolution_clock> start_time_;
public:
enum class Unit : uint8_t
{
S = 0, // 秒
MS = 4, // 毫秒
US = 2 // 微秒
};
Timer(const std::string &tag, const Unit &unit = Unit::MS)
: tag_(tag)
, unit_(unit)
, start_time_(std::chrono::high_resolution_clock::now())
{}
~Timer()
{
const auto end_time = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time_).count();
if (Unit::S == unit_)
{
std::cout << "[" << tag_ << "] cost: " << duration / (1000.0 * 1000.0) << " s" << std::endl;
}
else if (Unit::MS == unit_)
{
std::cout << "[" << tag_ << "] cost: " << duration / 1000.0 << " ms" << std::endl;
}
else
{
std::cout << "[" << tag_ << "] cost: " << duration << " us" << std::endl;
}
}
};
// 测试
#include <unistd.h>
int main() {
{
Timer t("tag1");
sleep(1);
}
{
Timer t("tag2");
sleep(1);
}
{
Timer t("tag3");
sleep(1);
}
{
Timer t("tag3", Timer::Unit::S);
sleep(1);
}
return 0;
}
本文由作者按照 CC BY 4.0 进行授权