avatar

目录
时间统计特性开发

设计思路

总体思路:首先设计一个类 SingleConvertTime, 利用这个类的构造和析构进行单次 convert 的时间的计算,将这个类的实例化加入到 convert 模板中,之后设计一个单例 SingleConvertTime 进行管理,统计各个消息实时转化的最值。

计算采用纳秒级别的精准度,最后文件输出统一以微妙精度。

由于消息存在嵌套,并且同一种消息类型可能会有不同的父消息类型,所以如果只按照 message type 为单位区分统计时间,会导致下层消息混乱统计(同名的消息都会被统一计算,他们可能来自于不同的父消息),结果容易造成误导,而最外层的消息类型统计是不存在这种情况,所以暂时提供最外层消息 convert 时间统计。

准备

单例模式:使用懒汉式单例(magic static )——局部静态变量

详细思路

c++
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
struct TimeTrace {
uint64_t max_time = 0;
uint64_t min_time = LONG_MAX;
uint64_t sum_time = 0;
uint64_t convert_times = 0;
};

struct ConvertTimeSettings { //可提供用户外部自定义
std::string path = "/home/ros/convert_time";
std::string file_name = "time_record";
int time_interval = 5000;
};


class ConvertTimeTrace {
public:
ConvertTimeTrace(const std::string &str) : message_type_(str) {
//记录当前消息初始时间
}
~ConvertTimeTrace() {
ConvertTimeRecorder& instance = ConvertTimeRecorder::get_instance();
//记录当前消息结束时间,计算时间差,调用单例update 接口更新
}


class ConvertTimeRecorder {
public:
static ConvertTimeRecorder& get_instance(){
static ConvertTimeRecorder instance;
return instance;
}
ConvertTimeRecorder(ConvertTimeRecorder&) = delete;
ConvertTimeRecorder& operator = (const ConvertTimeRecorder&) = delete;
void update(const std::string &message_type, const uint64_t &time) {
//更新最大值,最小值,sum, convert次数 这里写容器上锁,同时这里触发时判断是否和上次写文件达到5000ms,达到就调用写文件
}
void print_time() {
//求平均值,进行输出文件,以 txt 格式输出,文件名加进行id进行区分不同模块
}

void update_layer(const std::thread::id &thread_id, const int &number) { layer_count_[thread_id] += number;} //这个和下面的函数用于实现只统计最外层消息

int get_layer_number(const std::thread::id &thread_id ) { return layer_count_[thread_id];}

void set_settings(ConvertTimeSettings settings) { settings_ = settings; }

ConvertTimeSettings& get_settings() { return settings_; }

~ConvertTimeRecorder() {
print_time()
}
private:
ConvertTimeRecorder()
{}
std::chrono::steady_clock::time_point print_start_time_; //用于记录打印的时间
std::mutex mutex_;
std::map<std::string, TimeTrace> record_time_;
ConvertTimeSettings settings_;
std::map<std::thread::id, int> layer_count_;
}
文章作者: Sunxin
文章链接: https://sunxin18.github.io/2021/06/07/record-time/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论