たとえば、C++を使用してWindowsで長期的な高解像度のタイミングを実現する方法を参照してください。ナノ秒単位の時間を提供するC++タイマー機能。
私はWindowsXPでCygwinを使用していくつかのテストを行いました。私のマシンでは、gettimeofday()の粒度は約15ミリ秒(〜1/64秒)です。これはかなり粗いです。そして、次の粒度も同様です。
* clock_t clock(void) (divisor CLOCKS_PER_SEC)
* clock_t times(struct tms *) (divisor sysconf(_SC_CLK_TCK))
両方の除数は1000です(POSIXは最初に1000000になる場合があります)。
また、clock_getres(CLOCK_REALTIME、...)は15ミリ秒を返すため、clock_gettime()が役立つ可能性はほとんどありません。また、CLOCK_MONOTONICとCLOCK_PROCESS_CPUTIME_IDは機能しません。
Windowsの他の可能性はRDTSCかもしれません; ウィキペディアの記事を参照してください。また、HPETは、WindowsXPでは使用できません。
また、Linuxではclock()がプロセス時間であり、Windowsではウォールタイムであることに注意してください。
そのため、標準のUnix用とWindowsで実行されているCYGWINコード用のサンプルコードがあります。これにより、(私のマシンでは)約50マイクロ秒の粒度が得られます。戻り値は秒単位で、関数が最初に呼び出されてから経過した秒数を示します。(私は遅ればせながら、これが1年以上前に私が与えた答えにあることに気づきました)。
#ifndef __CYGWIN32__
double RealElapsedTime(void) { // returns 0 seconds first time called
static struct timeval t0;
struct timeval tv;
gettimeofday(&tv, 0);
if (!t0.tv_sec)
t0 = tv;
return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec) / 1000000.;
}
#else
#include <windows.h>
double RealElapsedTime(void) { // granularity about 50 microsecs on my machine
static LARGE_INTEGER freq, start;
LARGE_INTEGER count;
if (!QueryPerformanceCounter(&count))
FatalError("QueryPerformanceCounter");
if (!freq.QuadPart) { // one time initialization
if (!QueryPerformanceFrequency(&freq))
FatalError("QueryPerformanceFrequency");
start = count;
}
return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart;
}
#endif