2017-02-12 15 views
1

Я разрабатываю приложение C++ для кросс-платформенной 32-битной встроенной системы (windows и linux). Для одной необходимой функциональности мне нужно вычислить разницу во времени в миллисекундах. Во-первых, самая большая точность, которую дает временная метка эпохи для 32-битных систем, - это вторая. Большинство соответствующих ответов, которые я наткнулся либо 64bit, связанных как с использованием станд :: часы или станд :: хроно как:Как получить разницу во времени в миллисекундах в кросс-платформенной C++ 32-битной системе?

std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count(); 

Или система sprecific с помощью

#include <sys/time.h> 

или функцию GetSystemTime на окнах. Я также проверил связанные с poco функции времени, но они также основаны на использовании 64-битных переменных. Можно ли это сделать с существующей стандартной или внешней библиотекой C++ или мне следует придерживаться другого подхода?

+0

Вам нужно время в миллисекундах или вам нужна разница между двумя точками времени в миллисекундах? – rustyx

+0

@RustyX Мне нужна разница между двумя временными точками в миллисекундах, но я предполагаю, что если я смогу получить время в миллисекундах в разные моменты времени, это тоже будет выполняться, если только я что-то не упустил. – dk13

+0

Нет стандартного портативного способа получить время в миллисекундах. 'chrono :: system_clock' часто имеет точность 1 с, а' chrono :: high_resolution_clock' не начинается в эпоху. – rustyx

ответ

4

Вот способ С ++ 11, чтобы получить время эпохи и разницу во времени в миллисекундах (ну std::literals является C++ 14, но вы не должны использовать это):

#include <iostream> 
#include <chrono> 

using namespace std::literals; 

int main() 
{ 
    using Clock = std::chrono::system_clock; 
    auto point1 = Clock::now(); 
    int64_t epoch = point1.time_since_epoch()/1ms; 
    std::cout << "Time since epoch: " << epoch << std::endl; 
    auto point2 = Clock::now(); 
    std::cout << "Time difference in milliseconds: " << ((point2 - point1)/1ms) << std::endl; 
    std::cout << "Time difference in nanoseconds: " << ((point2 - point1)/1ns) << std::endl; 
} 

system_clock demo

Time since epoch: 1486930917677 
Time difference in milliseconds: 0 
Time difference in nanoseconds: 102000 

Для высокого разрешения времени точечных различий стандарта имеет chrono::high_resolution_clock, что может предложить более высокую точность, чем chrono::system_clock, но эпоха его часто начинается во время загрузки системы, не на 1-1-1970.

high_resolution_clock demo

Time since "epoch": 179272927 
Time difference in milliseconds: 0 
Time difference in nanoseconds: 74980 

Имейте в виду, что до сих пор high_resolution_clock 1 секунду точность на Visual Studio до 2015 г. Он имеет 100ns точность в Visual Studio 2015+ и должны иметь по крайней мере 1 мс точность на другие платформы.

PS std::chrono работает точно так же в 32-битных и 64-битных системах.