Технические вопросы и ответы QA1398

Мах абсолютные единицы измерения времени

Q: Я пытаюсь получить точное измерительное использование синхронизации mach_absolute_time. Во сколько модули это использует? В частности, если я провожу в два раза измерения и вычитаю ранее из позже, как я преобразовываю результат в значение реального мира?

A: Я пытаюсь получить точное измерительное использование синхронизации mach_absolute_time. Во сколько модули это использует? В частности, если я провожу в два раза измерения и вычитаю ранее из позже, как я преобразовываю результат в значение реального мира?

Эта функция возвращает свой результат с точки зрения Маха абсолютная единица измерения времени. Этот модуль является зависимым CPU, таким образом, Вы не можете только умножить его на константу для получения значения реального мира. Скорее необходимо вызвать предоставленную системой функцию преобразования для преобразования его в значение реального мира.

Самые простые функции преобразования для использования AbsoluteToNanoseconds и AbsoluteToDuration от платформы CoreServices. Можно также войти в другое использование направления NanosecondsToAbsolute и DurationToAbsolute. Перечисление 1 показывает пример того, как получить реальный мир, синхронизирующий использование результатов mach_absolute_time.

Перечисление 1  , Преобразовывающее Маха абсолютное время в наносекунды с помощью AbsoluteToNanoseconds

#include <assert.h>
#include <CoreServices/CoreServices.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <unistd.h>

uint64_t GetPIDTimeInNanoseconds(void)
{
    uint64_t        start;
    uint64_t        end;
    uint64_t        elapsed;
    Nanoseconds     elapsedNano;

    // Start the clock.

    start = mach_absolute_time();

    // Call getpid. This will produce inaccurate results because 
    // we're only making a single system call. For more accurate 
    // results you should call getpid multiple times and average 
    // the results.

    (void) getpid();

    // Stop the clock.

    end = mach_absolute_time();

    // Calculate the duration.

    elapsed = end - start;

    // Convert to nanoseconds.

    // Have to do some pointer fun because AbsoluteToNanoseconds 
    // works in terms of UnsignedWide, which is a structure rather 
    // than a proper 64-bit integer.

    elapsedNano = AbsoluteToNanoseconds( *(AbsoluteTime *) &elapsed );

    return * (uint64_t *) &elapsedNano;
}

Если Ваша программа не может использовать платформу CoreServices, можно выполнить эквивалентное преобразование с помощью информации, возвращенной mach_timebase_info, как показано в Перечислении 2.

Перечисление 2  , Преобразовывающее Маха абсолютное время в наносекунды с помощью mach_timebase_info

#include <assert.h>
#include <CoreServices/CoreServices.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <unistd.h>

uint64_t GetPIDTimeInNanoseconds(void)
{
    uint64_t        start;
    uint64_t        end;
    uint64_t        elapsed;
    uint64_t        elapsedNano;
    static mach_timebase_info_data_t    sTimebaseInfo;

    // Start the clock.

    start = mach_absolute_time();

    // Call getpid. This will produce inaccurate results because 
    // we're only making a single system call. For more accurate 
    // results you should call getpid multiple times and average 
    // the results.

    (void) getpid();

    // Stop the clock.

    end = mach_absolute_time();

    // Calculate the duration.

    elapsed = end - start;

    // Convert to nanoseconds.

    // If this is the first time we've run, get the timebase.
    // We can use denom == 0 to indicate that sTimebaseInfo is 
    // uninitialised because it makes no sense to have a zero 
    // denominator is a fraction.

    if ( sTimebaseInfo.denom == 0 ) {
        (void) mach_timebase_info(&sTimebaseInfo);
    }

    // Do the maths. We hope that the multiplication doesn't 
    // overflow; the price you pay for working in fixed point.

    elapsedNano = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom;

    return elapsedNano;
}


История версии документа


ДатаПримечания
06.01.2005

Новый документ, описывающий, как преобразовать Маха абсолютные единицы измерения времени в реальное время, и наоборот.