C++测量函数调用和回调之间的时间

C++ measure time between function call and callback

本文关键字:之间 时间 回调 测量 函数调用 C++      更新时间:2023-10-16

我正在为异步应用程序开发一个自动化测试框架。缺席的一个方面是应用程序响应时间行为。我想知道是否以及如何跟踪函数调用和相应事件回调函数调用之间的时间。

示例:

我正在设置音频输入设备的输入增益

virtual void setGain(unsigned int gain) = 0; 

这导致底层库执行一些系统调用,并且迟早会触发事件

virtual void onGainChanged(IRtcAudioRecordingDevicePtr device, unsigned int gain) = 0;

现在的目标是,在调用setGain时获得当前时间,在调用onGainChanged时确定时间跨度。

这应该由外部组件(例如RuntimeObserver)尽可能通用地完成。

关于如何设计这样一个模块,你有什么线索吗?

提前感谢

如果所有东西都在同一个平台上,那么这个系统可以归结为两部分:1:时间测量和2:通用实现(更有问题)

1时间测量:

这背后的概念是测量调用setGainonGainChanged的时间。这两个时间测量值之间的差值将等于您想要测量的时间延迟。

以下是一些使用组合类型和函数的基本示例(稍后将对此进行解释):

TimeValue s = GetNowTime();
setGain(...);
//after some computations:
TimeValue e = GetNowTime();
onGainChanged(...);
TimeDuration d = (e - s);
cout << "Lag:" << d;

在win32平台上,TimeValue(和TimeDuration)可以是unsigned intGetNowTime可以是timeGetTime。结果将以毫秒为单位。

如果您正在寻找跨平台的解决方案(在c++98中),最好选择boost::timerboost::chrono这样的库(您应该先调查并检查可用的解决方案)。理想情况下,如果切换到c++11,则可以使用std::chrono(此处TimeValuestd::chrono::time_pointTimeDurationstd::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

我在脑子里写下了代码,我希望我没有错过任何错误。