高解像度のタイムソースが保証されていない限り、タイムスタンプはこれにはあまり適していません。一部のシステムにはこれがあり、他のシステムにはありません。
特に、システムに複数の CPU がある場合、各 CPU の「タイムスタンプ カウンター」が同期していない可能性があるため、1 つの CPU のクロックサイクル数が別の CPU のクロックサイクル数よりも「遅れている」という理由だけで重複が発生する可能性があります。
clock_gettime
POSIX システムでは、ナノ秒の分解能を持ち、かなり高速な を使用できる場合があります。
私はそれをテストするためにこのコードを書きました:
#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);
}
ビジュアルスタジオにアトミックがあるかどうかはわかりませんが、使用できますInterlockedINcrement64()
:
InterlockedIncrement64(¤t);