簡體   English   中英

如何獲得足夠精確的時間戳以使每次獲取的時間戳都不同?

[英]How to get timestamp exact enough to differ every time it's fetched?

要生成全局唯一ID,我需要類似其創建的時間戳記。 但是這些ID可以在源代碼中彼此直接生成。 因此,以毫秒為單位的時間不夠准確,可能會無意間產生相等的id。

因此,我需要一個足夠精確的時間戳,以便每次獲取時都不同。 我雖然是關於CPU周期的,但是我不知道是否有一種獲取此信息的方法。

由於這是用於實時游戲,因此獲取時間戳與性能有關。 而且,它與Linux,Windows和Mac具有跨平台兼容性,因此時間戳當然也應該是。 如果沒有標准方法,我可以使用三種獨特的系統解決方案。

時間戳不是很好,除非保證您有高分辨率的時間源。 有些系統具有此功能,而其他系統則沒有。

特別是,如果系統有多個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); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM