Захват времени в миллисекундах
Следующий фрагмент кода используется для печати времени в журналах:
#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<<">>";
Есть ли способ добавить миллисекунды к этому?
Ответы
Ответ 1
Чтобы иметь миллисекундную точность, вам нужно использовать системные вызовы, специфичные для вашей ОС.
В 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
Конечно, вы можете использовать Boost, чтобы сделать это для вас:)
Ответ 2
// С++ 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;
Ответ 3
Вам нужен таймер с более высоким разрешением для захвата миллисекунд. Попробуйте следующее:
int cloc = clock();
//do something that takes a few milliseconds
cout << (clock() - cloc) << endl;
Это, конечно, зависит от вашей ОС.
Ответ 4
Таймеры с высоким разрешением обычно gettimeofday на платформах стиля Linux и QueryPerformanceCounter в Windows.
Вы должны знать, что синхронизация продолжительности одной операции (даже с таймером с высоким разрешением) не даст точных результатов. В игре слишком много случайных факторов. Чтобы получить надежную информацию о времени, вы должны запустить задачу, которая должна быть синхронизирована в цикле, и вычислить среднее время задачи. Для этого типа синхронизации функция clock() должна быть достаточной.
Ответ 5
Если вы не хотите использовать какой-либо OS-код, вы можете использовать пакет 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 поддерживает эту ОС).
Ответ 6
В 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
Ответ 7
Новый ответ для старого вопроса с использованием С++ 11 или С++ 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