аналог функции QueryPerformanceFrequency
От: sergey2b ЮАР  
Дата: 25.05.20 03:57
Оценка:
подскажите пожалуйста какой под linux есть аналог функции QueryPerformanceFrequency
Re: аналог функции QueryPerformanceFrequency
От: Alexander G Украина  
Дата: 25.05.20 04:08
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста какой под linux есть аналог функции QueryPerformanceFrequency


По идее, реализация стандартной библиотеки реализует std::chrono::steady_clock с максимальной точностью
(ибо std::chrono::high_resolution_clock малополезен из-за негарантированного steadyness, для точных замеров используют steady_clock)

Поэтому вместо деления QueryPerformanceCounter на QueryPerformanceFrequency должно быть достаточно просто взять steady_clock для большинства случаев — это будет портабельный С++.

(Я, однако, не специалист по линуксам, знаю, что в Windows steady_clock делают именно на QPF / QPC)
Русский военный корабль идёт ко дну!
Re: аналог функции QueryPerformanceFrequency
От: ononim  
Дата: 25.05.20 10:01
Оценка: 11 (2)
S>подскажите пожалуйста какой под linux есть аналог функции QueryPerformanceFrequency
clock_getres / clock_gettime
Как много веселых ребят, и все делают велосипед...
Re[2]: аналог функции QueryPerformanceFrequency
От: sergey2b ЮАР  
Дата: 25.05.20 13:27
Оценка:
Здравствуйте, ononim, Вы писали:

S>>подскажите пожалуйста какой под linux есть аналог функции QueryPerformanceFrequency

O>clock_getres / clock_gettime

про clock_getres я знаю
но не понял как его использовать
Re[2]: аналог функции QueryPerformanceFrequency
От: sergey2b ЮАР  
Дата: 26.05.20 14:33
Оценка:
Здравствуйте, ononim, Вы писали:

S>>подскажите пожалуйста какой под linux есть аналог функции QueryPerformanceFrequency

O>clock_getres / clock_gettime


я посмотрел в wine
интерестно что они возрашают константу


/******************************************************************************
 *  RtlQueryPerformanceCounter   [NTDLL.@]
 */
BOOL WINAPI DECLSPEC_HOTPATCH RtlQueryPerformanceCounter( LARGE_INTEGER *counter )
{
    counter->QuadPart = monotonic_counter();
    return TRUE;
}

/******************************************************************************
 *  RtlQueryPerformanceFrequency   [NTDLL.@]
 */
BOOL WINAPI DECLSPEC_HOTPATCH RtlQueryPerformanceFrequency( LARGE_INTEGER *frequency )
{
    frequency->QuadPart = TICKSPERSEC;
    return TRUE;
}


/* return a monotonic time counter, in Win32 ticks */
static inline ULONGLONG monotonic_counter(void)
{
    struct timeval now;

#ifdef __APPLE__
    static mach_timebase_info_data_t timebase;

    if (!timebase.denom) mach_timebase_info( &timebase );
#ifdef HAVE_MACH_CONTINUOUS_TIME
    if (&mach_continuous_time != NULL)
        return mach_continuous_time() * timebase.numer / timebase.denom / 100;
#endif
    return mach_absolute_time() * timebase.numer / timebase.denom / 100;
#elif defined(HAVE_CLOCK_GETTIME)
    struct timespec ts;
#ifdef CLOCK_MONOTONIC_RAW
    if (!clock_gettime( CLOCK_MONOTONIC_RAW, &ts ))
        return ts.tv_sec * (ULONGLONG)TICKSPERSEC + ts.tv_nsec / 100;
#endif
    if (!clock_gettime( CLOCK_MONOTONIC, &ts ))
        return ts.tv_sec * (ULONGLONG)TICKSPERSEC + ts.tv_nsec / 100;
#endif

    gettimeofday( &now, 0 );
    return now.tv_sec * (ULONGLONG)TICKSPERSEC + now.tv_usec * 10 + TICKS_1601_TO_1970 - server_start_time;
}
Re[3]: аналог функции QueryPerformanceFrequency
От: ononim  
Дата: 26.05.20 15:10
Оценка: 6 (1)
O>>clock_getres / clock_gettime
S>про clock_getres я знаю
S>но не понял как его использовать
Она возвращает не частоту, а разрешение, просто FYI. А clock_gettime просто возвращает время. Не надо ничего потом умножать/длить, в отличии от QPF.
Как много веселых ребят, и все делают велосипед...
Re[3]: example
От: sts  
Дата: 10.07.20 21:46
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, ononim, Вы писали:


S>>>подскажите пожалуйста какой под linux есть аналог функции QueryPerformanceFrequency

O>>clock_getres / clock_gettime

S>про clock_getres я знаю

S>но не понял как его использовать

#include < stdio.h > //Для printf
#include < time.h >  //Для clock_getres

int main (void)
{  
   // Структуры для сохранения разрешения часов
   struct timespec res_clock; 
   // Переменная для расчета минимального интервала времени
   // доступного для измерения
   int res;            

   // Определяем разрешающую способность часов
   clock_getres (CLOCK_REALTIME, &res_clock);

   // Рассчитываем минимальный интервал времени в наносекундах
   res=1000000000*res_clock.tv_sec + res_clock.tv_nsec;
   // Выводим результат расчета на консоль
   printf (“%d нс\n”,res);

   return 0;
}

Результат:

1 нс
Re[4]: example
От: sergey2b ЮАР  
Дата: 10.07.20 21:49
Оценка:
Здравствуйте, sts, Вы писали:

sts>Здравствуйте, sergey2b, Вы писали:


Я в Вайне посмотрел как сделать
Re: аналог функции QueryPerformanceFrequency
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.07.20 22:09
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста какой под linux есть аналог функции QueryPerformanceFrequency


В венде эта функция нужна, чтобы узнать, в каких единицах возвращает время QueryPerformanceCounter. Но зачем она тебе нужна в линухе?
Re[2]: аналог функции QueryPerformanceFrequency
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.07.20 08:47
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>В венде эта функция нужна, чтобы узнать, в каких единицах возвращает время QueryPerformanceCounter. Но зачем она тебе нужна в линухе?


Хм, на весь линух только один таймер?
Re[3]: аналог функции QueryPerformanceFrequency
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.07.20 10:15
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Хм, на весь линух только один таймер?


При чем здесь?

Линух всегда возвращает время в секундах и микросекундах или секундах и наносекундах, и единицы измерения заранее известны и не зависят от аппаратуры или чего-нибудь еще. Поэтому их не надо выяснять во время исполнения.
Re[3]: аналог функции QueryPerformanceFrequency
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.07.20 10:22
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>про clock_getres я знаю

S>но не понял как его использовать

clock_getres возвращает не единицы измерения времени, я его точность. Например, время ты получаешь в секундах с наносекундами, но реальная точность, определяемая аппаратурой — одна миллисекунда. Соответственнно, более мелкие отрезки времени ты на этом устройстве напрямую не измеришь (в некоторых случаях можно измерить косвенно, например, повторить что-то миллион раз, и поделить на миллион, но, например, время между последовательно принятыми сетевыми пакетами ты так не измеришь, потому что это событие нельзя повторить).
Re[4]: аналог функции QueryPerformanceFrequency
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.07.20 11:29
Оценка:
Здравствуйте, Pzz, Вы писали:

ЕМ>>Хм, на весь линух только один таймер?


Pzz>При чем здесь?


При том, что у разных аппаратных таймеров разное разрешение. Даже если в API время возвращается в фемтосекундах, реальное разрешение таймера может быть порядка микросекунд, а то и хуже. Это может быть важно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.