c++ - 如何在跨平台c++ 32位系统中获取以毫秒为单位的时间差?

标签 c++ timestamp 32-bit milliseconds

我正在为跨平台 32 位嵌入式系统(Windows 和 Linux)开发一个 C++ 应用程序。对于一个需要的功能,我需要以毫秒为单位计算时间差。首先,纪元时间戳为 32 位系统提供的最大精度是一秒。我遇到的大多数相关答案都与 64 位相关,例如使用 std::clock 或 std::chrono,例如:

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

或系统特定使用

#include <sys/time.h>  

或 Windows 上的 GetSystemTime 函数。我还检查了 poco 相关的时间函数,但它们也是基于使用 64 位变量。这可以通过现有的标准或外部 C++ 库来完成,还是我应该采用不同的方法?

最佳答案

这里有一个 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 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 在 2015 年之前在 Visual Studio 上仍具有 1 秒的精度。它在 Visual Studio 2015+ 中具有 100ns 的精度,并且应该至少具有 1ms 的精度在其他平台上。

PS std::chrono 在 32 位和 64 位系统上的工作方式完全相同。

关于c++ - 如何在跨平台c++ 32位系统中获取以毫秒为单位的时间差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42191997/

相关文章:

python - 将带有季度的时间戳字符串解析为 Python 日期时间

java - Flex 编译器不适用于 32 位 JVM(1.8.0_25)

c++ - 运算符重载需要括号

c++ - 从并发关联容器中删除 (concurrent_unordered_map)

datetime - 如何更改 rsyslog 上的时间戳格式

mysql - 如何在 MySQL 中将现有列更改为默认插入时的当前时间?

Eclipse 以 64 位运行应用程序。 JAR 以 32 位运行

.net - 从 x64 位操作系统上构建的 "Any CPU"应用程序反射 x86 程序集

c++ - 这是 iostream.h 和 iostream 之间的区别吗

c++ - LabView 中的原生 Vector<Double> 作为参数/返回