CARLA
 
载入中...
搜索中...
未找到
Profiler.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once // 防止头文件重复包含
8
9#ifndef LIBCARLA_ENABLE_PROFILER // 如果没有启用性能分析器
10# define CARLA_PROFILE_SCOPE(context, profiler_name) // 定义宏,空操作
11# define CARLA_PROFILE_FPS(context, profiler_name) // 定义宏,空操作,这里的代码将用于开始或更新一个性能分析器,与给定的上下文和名称相关,它包括获取当前时间戳,更新帧率统计,或者开始一个新的性能分析区间
12#else
13
14#include "carla/StopWatch.h" // 引入计时器头文件
15
16#include <algorithm> // 包含算法库,用于常用算法
17#include <limits> // 包含极限值定义
18#include <string> // 包含字符串库
19
20namespace carla { // 开始 carla 命名空间
21namespace profiler { // 开始 profiler 命名空间
22namespace detail { // 开始 detail 命名空间
23
24 class ProfilerData { // 性能数据类
25 public:
26
27 explicit ProfilerData(std::string name, bool print_fps = false) // 构造函数,初始化名称和是否打印FPS
28 : _name(std::move(name)), // 移动名称
29 _print_fps(print_fps) {} // 设置打印FPS布尔值
30
31 ~ProfilerData(); // 析构函数声明
32
33 void Annotate(const StopWatch &stop_watch) { // 注解方法,记录时间数据
34 const auto elapsed_microseconds = stop_watch.GetElapsedTime<std::chrono::microseconds>(); // 获取经过的微秒数
35 ++_count; // 计数增加
36 _total_microseconds += elapsed_microseconds; // 总时间增加
37 _max_elapsed = std::max(elapsed_microseconds, _max_elapsed); // 更新最大时间
38 _min_elapsed = std::min(elapsed_microseconds, _min_elapsed); // 更新最小时间
39 }
40
41 float average() const { // 计算平均时间
42 return ms(_total_microseconds) / static_cast<float>(_count); // 将总时间(微秒)转换为毫秒,然后除以事件发生的次数,得到平均每次事件的毫秒数
43 }
44
45 float maximum() const { // 获取最大时间
46 return ms(_max_elapsed); // 返回最大时间(毫秒)
47 }
48
49 float minimum() const { // 获取最小时间
50 return ms(_min_elapsed); // 返回最小时间(毫秒)
51 }
52
53 private:
54
55 static inline float ms(size_t microseconds) { // 将微秒转换为毫秒
56 return 1e-3f * static_cast<float>(microseconds); // 转换公式
57 }
58
59 static inline float fps(float milliseconds) { // 根据毫秒计算FPS
60 return milliseconds > 0.0f ? (1e3f / milliseconds) : std::numeric_limits<float>::max(); // 如果 milliseconds 大于 0,则返回其倒数(每秒),否则返回无穷大
61 }
62
63 const std::string _name; // 性能监测名称
64
65 const bool _print_fps; // 是否打印FPS
66
67 size_t _count = 0u; // 记录次数
68
69 size_t _total_microseconds = 0u; // 总微秒数
70
71 size_t _max_elapsed = 0u; // 最大经历的时间
72
73 size_t _min_elapsed = std::numeric_limits<size_t>::max(); // 最小经历的时间(初始化为最大值)
74 };
75
76 class ScopedProfiler { // 作用域性能分析类
77 public:
78
79 explicit ScopedProfiler(ProfilerData &parent) : _profiler(parent) {} // 构造函数,接受父级性能数据引用
80
81 ~ScopedProfiler() { // 析构函数
82 _stop_watch.Stop(); // 停止计时器
83 _profiler.Annotate(_stop_watch); // 使用_stop_watch对象的信息来标注或更新_profiler的性能分析数据
84 }
85
86 private:
87
88 ProfilerData &_profiler; // 引用性能数据对象
89
90 StopWatch _stop_watch; // 计时器对象
91 };
92
93} // namespace detail
94} // namespace profiler
95} // namespace carla
96
97#ifdef LIBCARLA_WITH_GTEST // 如果启用了 GTest
98# define LIBCARLA_GTEST_GET_TEST_NAME() std::string(::testing::UnitTest::GetInstance()->current_test_info()->name()) // 获取当前测试名称
99#else
100# define LIBCARLA_GTEST_GET_TEST_NAME() std::string("") // 定义一个宏,用于获取当前测试的名称,但当前实现仅返回一个空字符串
101#endif // LIBCARLA_WITH_GTEST
102
103#define CARLA_PROFILE_SCOPE(context, profiler_name) \ // 定义性能分析作用域宏
104 static thread_local ::carla::profiler::detail::ProfilerData carla_profiler_ ## context ## _ ## profiler_name ## _data( \ // 创建性能数据实例
105 LIBCARLA_GTEST_GET_TEST_NAME() + "." #context "." #profiler_name); \ // 初始化性能数据名称
106 ::carla::profiler::detail::ScopedProfiler carla_profiler_ ## context ## _ ## profiler_name ## _scoped_profiler( \ // 创建作用域性能分析器,创建一个 ScopedProfiler实例,用于性能分析
107 carla_profiler_ ## context ## _ ## profiler_name ## _data); // 关联到性能数据
108
109#define CARLA_PROFILE_FPS(context, profiler_name) \ // 定义性能分析FPS宏
110 { \ // 开始代码块
111 static thread_local ::carla::StopWatch stop_watch; \ // 创建计时器实例
112 stop_watch.Stop(); \ // 停止计时器
113 static thread_local bool first_time = true; \ // 首次标志变量
114 if (!first_time) { \ // 如果不是第一次
115 static thread_local ::carla::profiler::detail::ProfilerData profiler_data( \ // 创建性能数据实例
116 LIBCARLA_GTEST_GET_TEST_NAME() + "." #context "." #profiler_name, true); \ // 初始化名称并设置打印FPS为真
117 profiler_data.Annotate(stop_watch); \ // 注解计时器数据
118 } else { \ // 如果是第一次
119 first_time = false; \ // 更新首次标志
120 } \
121 stop_watch.Restart(); \ // 重新启动计时器
122 }
123
124#endif // LIBCARLA_ENABLE_PROFILER
CARLA模拟器的主命名空间。
Definition Carla.cpp:139