2010-04-20 30 views
2

嗨:在iPhone应用程序中,我使用了一个库(C++),它在计算完成时异步地进行回调。 现在我想测量花费的时间 - 包括调用库的方法 - 直到回调完成。有没有可能通过Apple的Instruments应用程序来做到这一点?什么是最佳实践?库调用和回调之间的测量时间

回答

8

在过去,我使用以下方法进行网络调用,我不得不优化 - 尽管起初看起来有些复杂,但它确实给出了我所见过的最准确的时间。

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); 
} 
0

我写了一个C++类来包装mach_absolute_time调用。在测量时间差的事件开始/停止时,这可以方便地在代码中进行喷洒。

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

StopWatch.h

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

StopWatch.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; 
} 
相关问题