Как получить разницу во времени в миллисекундах в кросс-платформенной 32-битной системе c ++?

Я разрабатываю приложение на С ++ для кросс-платформенной 32-битной встроенной системы (Windows и Linux). Для одной необходимой функции мне нужно рассчитать разницу во времени в миллисекундах. Во-первых, самая большая точность, которую дает временная метка эпохи для 32-битных систем, - это секунда. Большинство соответствующих ответов, с которыми я столкнулся, связаны либо с 64-битными, например с использованием std :: clock, либо с std :: chrono, например:

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

Или специфично для системы, используя

#include <sys/time.h>  

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


person dk13    schedule 12.02.2017    source источник
comment
Вам нужно время эпохи в миллисекундах или вам нужна разница между двумя временными точками в миллисекундах?   -  person rustyx    schedule 12.02.2017
comment
@RustyX Мне нужна разница между двумя временными точками в миллисекундах, но я предполагаю, что если я могу получить время эпохи в миллисекундах в разные моменты времени, я также сделаю свою работу, если я что-то не упускаю.   -  person dk13    schedule 12.02.2017
comment
Не существует стандартного портативного способа получить время эпохи в миллисекундах. chrono::system_clock часто имеет точность 1 с, а chrono::high_resolution_clock не начинается с эпохи.   -  person rustyx    schedule 12.02.2017
comment
@RustyX Хорошо, тогда простой разницы между двумя временными точками в миллисекундах будет достаточно.   -  person dk13    schedule 12.02.2017


Ответы (1)


Вот способ C ++ 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

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

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

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

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

person rustyx    schedule 12.02.2017