C++测量函数调用和回调之间的时间
C++ measure time between function call and callback
我正在为异步应用程序开发一个自动化测试框架。缺席的一个方面是应用程序响应时间行为。我想知道是否以及如何跟踪函数调用和相应事件回调函数调用之间的时间。
示例:
我正在设置音频输入设备的输入增益
virtual void setGain(unsigned int gain) = 0;
这导致底层库执行一些系统调用,并且迟早会触发事件
virtual void onGainChanged(IRtcAudioRecordingDevicePtr device, unsigned int gain) = 0;
现在的目标是,在调用setGain时获得当前时间,在调用onGainChanged时确定时间跨度。
这应该由外部组件(例如RuntimeObserver)尽可能通用地完成。
关于如何设计这样一个模块,你有什么线索吗?
提前感谢
如果所有东西都在同一个平台上,那么这个系统可以归结为两部分:1:时间测量和2:通用实现(更有问题)
1时间测量:
这背后的概念是测量调用setGain
和onGainChanged
的时间。这两个时间测量值之间的差值将等于您想要测量的时间延迟。
以下是一些使用组合类型和函数的基本示例(稍后将对此进行解释):
TimeValue s = GetNowTime();
setGain(...);
//after some computations:
TimeValue e = GetNowTime();
onGainChanged(...);
TimeDuration d = (e - s);
cout << "Lag:" << d;
在win32平台上,TimeValue
(和TimeDuration
)可以是unsigned int
,GetNowTime
可以是timeGetTime
。结果将以毫秒为单位。
如果您正在寻找跨平台的解决方案(在c++98中),最好选择boost::timer
或boost::chrono
这样的库(您应该先调查并检查可用的解决方案)。理想情况下,如果切换到c++11,则可以使用std::chrono
(此处TimeValue
是std::chrono::time_point
,TimeDuration
是std::chrono::duration
)
2:实施
有很多方法可以以通用的方式实现这一点,我认为没有一个完美的解决方案。我会这样做的一种方法是:
//some header
enum Events
{
kGainEvent
};
#ifdef USE_EVENT_TRACKING
class EventTimeHandler
{
public:
using Duration = std::chrono::high_resolution_clock::duration;
using TimePoint = std::chrono::high_resolution_clock::time_point;
static EventTimeHandler* Instance;
EventTimeHandler();
void TrackStartEvent(Events e);
void TrackEndEvent(Events e);
private:
std::map<Events,TimePoint> m_times;
};
inline void TrackStartEvent(Events e)
{
EventTimeHandler::Instance->TrackStartEvent(e);
}
inline void TrackEndEvent(Events e)
{
EventTimeHandler::Instance->TrackEndEvent(e);
}
#else
inline void TrackStartEvent(Events e){}//empty implementaiton
inline void TrackEndEvent(Events e){}//empty implementaiton
#endif
//cpp file:
EventTimeHandler::EventTimeHandler()
{
Instance = this;
}
void EventTimeHandler::TrackStartEvent(Events e)
{
m_times[e] = std::chrono::high_resolution_clock::now();
}
void EventTimeHandler::TrackEndEvent(Events e)
{
TimePoint now_time = std::chrono::high_resolution_clock::now();
Duration d = now_time - m_times[e];//should check here if m_times has key e for safety ?
//print time in milseconds as double
std::cout << std::chrono::duration_cast<std::chrono::milliseconds<double>>(d).count();
}
用法:
TrackStartEvent(kGainEvent);
setGain(...);
//after some computations:
TrackEndEvent(kGainEvent);
onGainChanged(...);
//code will do nothing if USE_EVENT_TRACKING is not defined. This will allow to turn the system on and off
我在脑子里写下了代码,我希望我没有错过任何错误。
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 以天C++为单位的两个时间戳之间的差异
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 如何获取两个时间点之间的时间
- ESP32_BLE_Arduino库中的扫描窗口、间隔和扫描时间之间有什么区别
- 有序地图字符串搜索与整数搜索之间的时间复杂度
- 连续光线投射之间的时间延迟
- 如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时差(以毫秒为单位)
- 对于同一任务,线程的等待时间在 0 到 30000 微秒之间系统地切换
- 避免在统计数据和重命名之间进行TOCTOU(检查时间,使用时间)
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)
- 使用 c++ 获取两个日期与时间字符串之间的差异(以秒为单位)
- 结构成员的地址作为编译时间常数之间的差异
- 均衡符号和初始化之间的时间和空间复杂性是否存在差异
- 如何使用C ++在微秒和纳秒中获取两个时间间隔之间的差异
- sTD :: Chrono Clocks之间的播放时间_points
- 为什么这两个代码之间的运行时间差异这么长