[решено] [C] Как засечь промежуток времени с точностью до миллисекунд?

Модератор: Модераторы разделов

Ответить
Аватара пользователя
kosmonaFFFt
Сообщения: 183
ОС: win 7, Kubuntu 10.10

[решено] [C] Как засечь промежуток времени с точностью до миллисекунд?

Сообщение kosmonaFFFt »

Доброго времени суток...
Собственно вопрос - как в Linux, используя только возможности языка C засечь промежуток времени с точностью до миллисекунд?
Пробовал
clock_t before = clock();
/* тут код */
clock_t after = clock();
fprintf("%u", after - before), но на этом участке он выдает либо 0 (мало итераций в цикле, время которого замеряется),
либо прога падает с SEGFAULT...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [решено] [C] Как засечь промежуток времени с точностью до миллисекунд?

Сообщение NickLion »

Отрываю от сердца :) Работает и под виндой, и под Linux:

Код: Выделить всё

#pragma once
#ifndef TIMER_HR_H
#define TIMER_HR_H

#ifdef _WIN32

// Windows time query

#include <windows.h>

inline long long gettimeus()
{
    static LARGE_INTEGER ClockPerSecond = { 0 };
    if( ClockPerSecond.QuadPart == 0 ) QueryPerformanceFrequency( &ClockPerSecond );
    LARGE_INTEGER li;
    QueryPerformanceCounter( &li );
    return li.QuadPart * 1000000LL / ClockPerSecond.QuadPart;
}

#else // _WIN32

// UNIX time query

#include <sys/time.h>

inline long long gettimeus()
{
    struct timeval tv;

    gettimeofday( &tv, NULL );
    return (long long) tv.tv_sec * 1000000LL + (long long) tv.tv_usec;
}

#endif // _WIN32

#endif // TIMER_HR_H

Пользоваться так:

Код: Выделить всё

    long long tm = -gettimeus();
    // операция, требующая измерения;
    tm += gettimeus();

В tm будет время выполнения операции в микросекундах. Переделать под миллисекунды, думаю, несложно.

PS может могут быть проблемы при переходе через границу суток в Linux, было некритично - не проверял сей факт.
Спасибо сказали:
Ответить