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