C ++ получает время в миллисекундах в Linux - часы () не работают должным образом - PullRequest
97 голосов
/ 26 февраля 2009

В Windows clock() возвращает время в миллисекундах, но в этом окне Linux, над которым я работаю, оно округляется до ближайшей 1000, поэтому точность равна только «второму» уровню, а не уровню миллисекунд .

Я нашел решение с помощью Qt, используя класс QTime, создающий экземпляр объекта и вызывающий start() для него, затем вызывающий elapsed(), чтобы получить количество прошедших миллисекунд.

Мне повезло, потому что я с самого начала работаю с Qt, но я бы хотел решение, которое не зависит от сторонних библиотек,

Нет ли стандартного способа сделать это?

UPDATE

Пожалуйста, не рекомендуем Boost ..

Если Boost и Qt могут это сделать, конечно, это не волшебство, должно быть что-то стандартное, что они используют!

Ответы [ 16 ]

1 голос
/ 26 февраля 2009

Это должно работать ... проверено на Mac ...

#include <stdio.h>
#include <sys/time.h>

int main() {
        struct timeval tv;
        struct timezone tz;
        struct tm *tm;
        gettimeofday(&tv,&tz);
        tm=localtime(&tv.tv_sec);
        printf("StartTime: %d:%02d:%02d %d \n", tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
}

Да ... запустить его дважды и вычесть ...

1 голос
/ 26 февраля 2009

В стандарте POSIX clock имеет возвращаемое значение, определенное в терминах символа CLOCKS_PER_SEC, и реализация может определять его любым удобным способом. Под Linux мне повезло с функцией times().

0 голосов
/ 23 января 2016

Я написал C++ класс, используя timeb.

#include <sys/timeb.h>
class msTimer 
{
public:
    msTimer();
    void restart();
    float elapsedMs();
private:
    timeb t_start;
};

Функции-члены:

msTimer::msTimer() 
{ 
    restart(); 
}

void msTimer::restart() 
{ 
    ftime(&t_start); 
}

float msTimer::elapsedMs() 
{
    timeb t_now;
    ftime(&t_now);
    return (float)(t_now.time - t_start.time) * 1000.0f +
           (float)(t_now.millitm - t_start.millitm);
}

Пример использования:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char** argv) 
{
    msTimer t;
    for (int i = 0; i < 5000000; i++)
        ;
    std::cout << t.elapsedMs() << endl;
    return 0;
}

На моем компьютере выводится «19». Точность класса msTimer составляет порядка миллисекунд. В приведенном выше примере использования отслеживается общее время выполнения, занятое циклом for. На этот раз операционная система включала и выключала контекст выполнения main() из-за многозадачности.

0 голосов
/ 09 октября 2014

Мне нравится, что метод Hola Soy не использует gettimeofday (). Это случилось со мной на работающем сервере, администратор изменил часовой пояс. Часы были обновлены, чтобы показать то же (правильное) локальное значение. Это вызвало смещение функций time () и gettimeofday () на 2 часа, и все метки времени в некоторых службах застряли.

0 голосов
/ 11 августа 2010

В качестве обновления отображается, что в windows clock () измеряет время настенных часов (с точностью CLOCKS_PER_SEC)

 http://msdn.microsoft.com/en-us/library/4e2ess30(VS.71).aspx

в то время как в Linux он измеряет время процессора между ядрами, используемыми текущим процессом

http://www.manpagez.com/man/3/clock

и (как видно из исходного постера) на самом деле с меньшей точностью, чем CLOCKS_PER_SEC, хотя, возможно, это зависит от конкретной версии Linux.

0 голосов
/ 26 февраля 2009

Я предпочитаю библиотеку Boost Timer за ее простоту, но если вы не хотите использовать библиотеки третьих сторон, использование clock () кажется разумным.

...