c++ - 如何获得足够精确的时间戳,以便每次获取时都不同?

标签 c++ performance timestamp guid cpu-cycles

要生成全局唯一 ID,我需要类似创建时间戳之类的东西。但是这些 id 可以在源代码中一个接一个地直接生成。因此,以毫秒为单位的时间不够准确,可能会无意中产生相同的 ID。

因此,我需要一个足够精确的时间戳,以便每次获取时都不同。我虽然了解 CPU 周期,但我不知道是否有办法获取此信息。

由于这是实时游戏,获取时间戳与性能相关。此外,它与 Linux、Windows 和 Mac 是跨平台兼容的,所以时间戳当然也应该是。如果没有标准方法,我可以接受三种不同的系统解决方案。

最佳答案

时间戳对此不是很好,除非你保证有一个高分辨率的时间源。有些系统有这个,有些则没有。

特别是,如果系统有多个 CPU,每个 CPU 的“时间戳计数器”可能不同步,因此您可能会得到重复项,因为一个 CPU 上的时钟周期数“落后于”另一个 CPU 上的时钟周期数另一个 CPU。

在 POSIX 系统中,您可以使用 clock_gettime它确实具有纳秒分辨率,并且应该也相当快。

我写了这段代码来测试它:

#include <iostream>
#include <sys/time.h>

using namespace std;

int main ()
{
    timespec ts[100];

    for(auto &t : ts)
        clock_gettime(CLOCK_REALTIME, &t);
    timespec old_ts = {0};
    for(auto &t : ts)
    {
    long diff = 0;
    if (old_ts.tv_sec)
    {
        diff = t.tv_nsec - old_ts.tv_nsec;
    }
        cout << "ts.nsec: " << t.tv_nsec << " diff=" << diff << endl;
    old_ts = t;
    }
    return 0;
}

编辑:

当然,唯一 ID 最简单的形式是 64 位原子计数器 - 它速度最快,而且很简单。假设您具有 C++11 功能:

#include <atomic>

typdef long long int id_type;
std::atomic<id_type> current_id;

id_type get_next_id()
{
   return current_id.fetch_add(1);
}

不确定 visual studio 是否有原子,但你可以使用 InterlockedINcrement64() :

InterlockedIncrement64(&current); 

关于c++ - 如何获得足够精确的时间戳,以便每次获取时都不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18422635/

相关文章:

c++ - 最小化 lambda 表达式的对象范围

performance - Go:通过 slice slice (二维 slice )访问数组时出现意外性能

c# - DataTable 是否比 List<T> 消耗更多内存?

java - 基于URL参数缓存JSP

php - 如何提取从特定日期算起经过的秒数?

erlang:now 加时间戳并再次返回

c++ - 调用 CreateWindow() func WinApi 时出现错误 1813

c++ - 多少位用于指数

php - 如何手动将时间戳插入 mySQL 数据库?

c++ - 使用平凡的复制构造函数传递类对象,但没有输出?