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

C++ C++;测量函数调用和回调之间的时间,c++,function,callback,timestamp,C++,Function,Callback,Timestamp,我正在为异步应用程序开发一个自动化测试框架。 观察的一个方面是应用程序的响应时间行为。 我想知道是否以及如何跟踪函数调用和相应事件回调函数调用之间的时间 例如: 我正在设置音频输入设备的输入增益 virtual void setGain(unsigned int gain) = 0; 这会导致参考底图库执行一些系统调用,并迟早触发一个事件 virtual void onGainChanged(IRtcAudioRecordingDevicePtr device, unsigned int g

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

例如:

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

virtual void setGain(unsigned int gain) = 0; 
这会导致参考底图库执行一些系统调用,并迟早触发一个事件

virtual void onGainChanged(IRtcAudioRecordingDevicePtr device, unsigned int gain) = 0;
现在的目标是获取调用setGain和调用onGainChanged的当前时间,以确定时间跨度

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

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


提前感谢

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

1次测量:

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

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

用法:

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

我是从脑子里写出来的代码,希望我没有错过任何错误。

是不是在同一台设备上调用了
setGain
onGainChanged
?还有,目标平台是什么(IOS、Win32等)?是的,它们在同一设备上被调用,并且如果之前没有收到onGainChanged,则可以确保不会有两个或更多对setGain的调用。目标平台是Win32以及Mac OSX。第一步,重点是移动平台,因此它应该是独立于平台的…好的,还有一个问题,您使用的是C++11还是C++98?此外,所需的计时器精度(毫秒/秒)是多少?我们使用的是c++98,但它似乎没有更新为11。毫秒将是伟大的,但它不必是1毫秒的精度…好的,将写一个简短的答复这看起来相当不错!这周我会试试的谢谢你。
//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