Захват времени в миллисекундах - PullRequest
12 голосов
/ 13 июля 2009

Следующий фрагмент кода используется для печати времени в журналах:

#define PRINTTIME() struct tm  * tmptime;
time_t     tmpGetTime;
time(&tmpGetTime);
tmptime = localtime(&tmpGetTime);
cout << tmptime->tm_mday << "/" <<tmptime->tm_mon+1 << "/" << 1900+tmptime->tm_year << " " << tmptime->tm_hour << ":" << tmptime->tm_min << ":" << tmptime->tm_sec<<">>";

Есть ли способ добавить миллисекунды к этому?

Ответы [ 7 ]

20 голосов
/ 13 июля 2009

Чтобы получить точность в миллисекундах, вы должны использовать системные вызовы, специфичные для вашей ОС.

В Linux вы можете использовать

#include <sys/time.h>

timeval tv;
gettimeofday(&tv, 0);
// then convert struct tv to your needed ms precision

timeval имеет микросекундную точность.

В Windows вы можете использовать:

#include <Windows.h>

SYSTEMTIME st;
GetSystemTime(&st);
// then convert st to your precision needs

Конечно, вы можете использовать Повышение , чтобы сделать это для вас:)

16 голосов
/ 02 января 2015

// C ++ 11 Стиль:

cout << "Time in Milliseconds =" << 
 chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
 << std::endl;

cout << "Time in MicroSeconds=" << 
 chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
 << std::endl;
4 голосов
/ 13 июля 2009

Вам нужен таймер с более высоким разрешением для захвата миллисекунд. Попробуйте это:

int cloc = clock();
//do something that takes a few milliseconds
cout << (clock() - cloc) << endl;

Это, конечно, зависит от вашей ОС.

2 голосов
/ 07 сентября 2009

Если вы не хотите использовать какой-либо специфичный для ОС код, вы можете использовать пакет ACE, который обеспечивает функцию ACE_OS::gettimeofday для большинства стандартных операционных систем. Например:

ACE_Time_Value startTime = ACE_OS::gettimeofday();

do_something();

ACE_Time_Value endTime = ACE_OS::gettimeofday();

cout << "Elapsed time: " << (endTime.sec() - startTime.sec()) << " seconds and " << double(endTime.usec() - startTime.usec()) / 1000 << " milliseconds." << endl;

Этот код будет работать независимо от вашей ОС (если ACE поддерживает эту ОС).

2 голосов
/ 13 июля 2009

Таймеры с высоким разрешением обычно получают timetimeofday на платформах в стиле Linux и QueryPerformanceCounter в Windows.

Вы должны знать, что синхронизация продолжительности одной операции (даже с таймером высокого разрешения) не даст точных результатов. В игре слишком много случайных факторов. Чтобы получить достоверную информацию о времени, вы должны запустить задачу, которая будет синхронизирована в цикле, и вычислить среднее время задачи. Для этого типа синхронизации достаточно использовать функцию clock ().

1 голос
/ 16 января 2017

Новый ответ на старый вопрос с использованием C ++ 11 или C ++ 14 и этой бесплатной библиотеки с открытым исходным кодом :

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;
    auto now = make_zoned(current_zone(), floor<milliseconds>(system_clock::now()));
    cout << format("%e/%m/%Y %T", now) << '\n';
}

Это просто вывод для меня:

16/01/2017 15:34:32.167

, которая является моей текущей локальной датой и временем с точностью до миллисекунды. Исключив floor<milliseconds>(), вы автоматически получите ту точность, которую имеет system_clock.

Если вы хотите получить результат в виде временной метки UTC вместо локальной временной метки, это еще проще:

    auto now = floor<milliseconds>(system_clock::now());
    cout << format("%e/%m/%Y %T", now) << '\n';

И если вам нужна метка времени UTC, и вы не требовательны к точности или формату, вы можете просто:

cout << system_clock::now() << '\n';

который просто выводит для меня:

2017-01-16 20:42:11.267245
1 голос
/ 29 декабря 2016

В Ubuntu 16.04 это работало для меня ...

const std::string currentDateTime() {
   char            fmt[64], buf[64];
   struct timeval  tv;
   struct tm       *tm;

   gettimeofday(&tv, NULL);
   tm = localtime(&tv.tv_sec);
   strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u", tm);
   snprintf(buf, sizeof buf, fmt, tv.tv_usec);
   return buf;
}

Тогда с ...

std::cout << currentDateTime();

Я получаю ...

2016-12-29 11:09:55.331008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...