设计思路
总体思路:首先设计一个类 SingleConvertTime, 利用这个类的构造和析构进行单次 convert 的时间的计算,将这个类的实例化加入到 convert 模板中,之后设计一个单例 SingleConvertTime 进行管理,统计各个消息实时转化的最值。
计算采用纳秒级别的精准度,最后文件输出统一以微妙精度。
由于消息存在嵌套,并且同一种消息类型可能会有不同的父消息类型,所以如果只按照 message type 为单位区分统计时间,会导致下层消息混乱统计(同名的消息都会被统一计算,他们可能来自于不同的父消息),结果容易造成误导,而最外层的消息类型统计是不存在这种情况,所以暂时提供最外层消息 convert 时间统计。
准备
单例模式:使用懒汉式单例(magic static )——局部静态变量
详细思路
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(); } 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) { } void print_time() { } 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_; }
|