Измерьте время между вызовом библиотеки и обратным вызовом - PullRequest
2 голосов
/ 20 апреля 2010

Привет: в приложении для iPhone я использую библиотеку (C ++), которая асинхронно выполняет обратный вызов по окончании вычисленийТеперь я хочу измерить время, которое тратится, включая метод, который вызывает библиотеку, до выполнения обратного вызова.Есть ли возможность сделать это с помощью приложения Instruments от Apple?Каковы лучшие практики?

Ответы [ 2 ]

8 голосов
/ 21 апреля 2010

В прошлом я использовал следующее для выполнения сетевых вызовов, которые мне пришлось оптимизировать - хотя поначалу это кажется немного запутанным, оно, безусловно, дает самые точные времена, которые я видел.

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 голосов
/ 02 января 2014

Я написал класс 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;
}
...