альтернатива clock_gettime в Mac OS X - PullRequest
64 голосов
/ 02 марта 2011

При компиляции программы, которую я написал в Mac OS X после установки необходимых библиотек через MacPorts, я получаю эту ошибку:

In function 'nanotime':
error: 'CLOCK_REALTIME' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)

Похоже, что clock_gettime не реализовано в Mac OS X.существуют ли альтернативные способы получения времени эпохи в наносекундах ?К сожалению, gettimeofday находится в микросекундах .

Ответы [ 13 ]

1 голос
/ 02 августа 2014

По крайней мере, начиная с Mountain Lion, mach_absolute_time() возвращает наносекунд , а не абсолютное время (которое было числом циклов шины).

Следующий код на моемMacBook Pro (Core I7 с частотой 2 ГГц) показал, что время вызова mach_absolute_time() составляет в среднем 39 нс за 10 прогонов (мин. 35, макс. 45), то есть, по сути, время между возвратом двух обращений к mach_absolute_time (), около 1вызов:

#include <stdint.h>
#include <mach/mach_time.h>
#include <iostream>

using namespace std;

int main()
{
   uint64_t now, then;
   uint64_t abs;

   then = mach_absolute_time(); // return nanoseconds
   now = mach_absolute_time();
   abs = now - then;

   cout << "nanoseconds = " << abs << endl;
}
0 голосов
/ 27 марта 2017
void clock_get_uptime(uint64_t *result);

void clock_get_system_microtime(            uint32_t *secs,
                                            uint32_t *microsecs);

void clock_get_system_nanotime(             uint32_t *secs,
                                            uint32_t *nanosecs);
void clock_get_calendar_microtime(          uint32_t *secs,
                                            uint32_t *microsecs);

void clock_get_calendar_nanotime(           uint32_t *secs,
                                            uint32_t *nanosecs);

Для MacOS вы можете найти хорошую информацию на странице их разработчиков https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/services/services.html

0 голосов
/ 21 января 2017

Я нашел другое переносимое решение.

Объявите в некотором заголовочном файле (или даже в вашем исходном):

/* If compiled on DARWIN/Apple platforms. */
#ifdef DARWIN
#define    CLOCK_REALTIME    0x2d4e1588
#define    CLOCK_MONOTONIC   0x0
#endif /* DARWIN */

И добавьте реализацию функции:

#ifdef DARWIN

/*
 * Bellow we provide an alternative for clock_gettime,
 * which is not implemented in Mac OS X.
 */
static inline int clock_gettime(int clock_id, struct timespec *ts)
{
    struct timeval tv;

    if (clock_id != CLOCK_REALTIME) 
    {
        errno = EINVAL;
        return -1;
    }
    if (gettimeofday(&tv, NULL) < 0) 
    {
        return -1;
    }
    ts->tv_sec = tv.tv_sec;
    ts->tv_nsec = tv.tv_usec * 1000;
    return 0;
}

#endif /* DARWIN */

Не забудьте включить <time.h>.

...