我正在研究异步应用程序的自动化测试框架。 要解决的一个方面是应用程序回答时间行为。 我想知道是否以及如何跟踪函数调用和相应事件回调函数的调用之间的时间。
示例:
我正在设置音频输入设备的输入增益
virtual void setGain(unsigned int gain) = 0;
这会导致底层库执行一些系统调用,并且迟早会触发事件
virtual void onGainChanged(IRtcAudioRecordingDevicePtr device, unsigned int gain) = 0;
现在的目的是获取setGain为calles的当前时间,以及调用onGainChanged时确定时间跨度。
这应该由外部组件(例如RuntimeObserver)完成,尽可能通用。
你有关于如何设计这样一个模块的线索吗?
提前谢谢
答案 0 :(得分:0)
如果所有内容都在同一平台上,则可归结为此系统的两个部分: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
我从头脑中编写了代码,希望我没有错过任何错误。