Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测量库调用和回调之间的时间_C++_Iphone_Objective C_Instruments_Performance - Fatal编程技术网

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

C++ 测量库调用和回调之间的时间,c++,iphone,objective-c,instruments,performance,C++,Iphone,Objective C,Instruments,Performance,嗨:在iPhone应用程序中,我使用一个库(C++),当计算完成时,它会异步进行回调。 现在,我想测量在进行回调之前所花费的时间,包括调用库的方法。苹果公司的Instruments应用程序有可能做到这一点吗?最佳实践是什么?过去,我使用以下方法进行网络呼叫,我必须对其进行优化-虽然起初它看起来有点复杂,但它肯定给出了我见过的最准确的时间 uint64_t time_a = mach_absolute_time(); // do stuff uint64_t time_b = mach_abs

嗨:在iPhone应用程序中,我使用一个库(C++),当计算完成时,它会异步进行回调。
现在,我想测量在进行回调之前所花费的时间,包括调用库的方法。苹果公司的Instruments应用程序有可能做到这一点吗?最佳实践是什么?

过去,我使用以下方法进行网络呼叫,我必须对其进行优化-虽然起初它看起来有点复杂,但它肯定给出了我见过的最准确的时间

uint64_t time_a = mach_absolute_time();

// do stuff

uint64_t time_b = mach_absolute_time();

[self logTime:(time_b-time_a)];

- (void) logTime:(uint64_t)machTime {
    static double timeScaleSeconds = 0.0;
    if (timeScaleSeconds == 0.0) {
        mach_timebase_info_data_t timebaseInfo;
        if (mach_timebase_info(&timebaseInfo) == KERN_SUCCESS) {
            double timeScaleMicroSeconds = ((double) timebaseInfo.numer / (double) timebaseInfo.denom) / 1000;
            timeScaleSeconds = timeScaleMicroSeconds / 1000000;
        }
    }

    NSLog(@"%g seconds", timeScaleSeconds*machTime);
}

我编写了一个C++类来包装MaxAsBaseTyTyTimes调用。这使得在事件开始/停止时插入代码以测量时差变得非常方便

如果您想在类中使用它来计时(在调用之间)或基于状态的行为(在计时器达到X后执行某些操作),它也可以很好地工作

秒表.h

class StopWatch
{
private:
        uint64 _start;
        uint64 _stop;
        uint64 _elapsed;
public:
   void Start();
   void Stop();
   void Reset();
   void Continue();
   double GetSeconds();
};
秒表.cpp

#include "Stopwatch.h"
#include <mach/mach_time.h>


void StopWatch::Start()
{
        _stop = 0;
        _elapsed = 0;
        _start = mach_absolute_time();
}

void StopWatch::Stop()
{
        _stop = mach_absolute_time();
   if(_start > 0)
   {
      if(_stop > _start)
      {
         _elapsed = _stop - _start;
      }
   }
}

void StopWatch::Reset()
{
   _start = 0;
   _stop  = 0;
   _elapsed = 0;
}

void StopWatch::Continue()
{
   _elapsed = 0;
   _stop = 0;
}

double StopWatch::GetSeconds()
{
   double elapsedSeconds = 0.0;
   uint64 elapsedTimeNano = 0;

        if(_elapsed > 0)
        {  // Stopped
                mach_timebase_info_data_t timeBaseInfo;
                mach_timebase_info(&timeBaseInfo);
                elapsedTimeNano = _elapsed * timeBaseInfo.numer / timeBaseInfo.denom;
                elapsedSeconds = elapsedTimeNano * 1.0E-9;
        }
        else if(_start > 0)
        {  // Running or Continued
      uint64_t elapsedTemp;
                uint64_t stopTemp = mach_absolute_time();
      if(stopTemp > _start)
      {
         elapsedTemp = stopTemp - _start;
      }
      else
      {
         elapsedTemp = 0;
      }
                mach_timebase_info_data_t timeBaseInfo;
                mach_timebase_info(&timeBaseInfo);
                elapsedTimeNano = elapsedTemp * timeBaseInfo.numer / timeBaseInfo.denom;
                elapsedSeconds = elapsedTimeNano * 1.0E-9;
        }
   return elapsedSeconds;
}
#包括“Stopwatch.h”
#包括
void秒表::Start()
{
_停止=0;
_经过=0;
_开始=马赫绝对时间();
}
void秒表::Stop()
{
_停止=马赫绝对时间();
如果(_start>0)
{
如果(\u停止>\u开始)
{
_经过时间=\u停止-\u开始;
}
}
}
无效秒表::重置()
{
_开始=0;
_停止=0;
_经过=0;
}
void秒表::Continue()
{
_经过=0;
_停止=0;
}
双秒表::GetSeconds()
{
双延时秒=0.0;
uint64 elapsedTimeNano=0;
如果(_已过>0)
{//停止
马赫时基信息数据时基信息;
马赫时基信息(和时基信息);
elapsedTimeNano=\u已用*timeBaseInfo.numer/timeBaseInfo.denom;
elapsedSeconds=elapsedTimeNano*1.0E-9;
}
否则如果(_start>0)
{//正在运行还是继续
uint64_t elapsedTemp;
uint64_t stopTemp=马赫绝对时间();
如果(停止温度>启动)
{
elapsedTemp=停止温度-\u启动;
}
其他的
{
elapsedTemp=0;
}
马赫时基信息数据时基信息;
马赫时基信息(和时基信息);
elapsedTimeNano=elapsedTemp*timeBaseInfo.numer/timeBaseInfo.denom;
elapsedSeconds=elapsedTimeNano*1.0E-9;
}
返回时间为秒;
}