有没有办法使用C标准库测量高达微秒的时间?

有没有一种独立平台的方法来使用C标准库来测量高达微秒的时间?

遗憾的是,测量精度取决于操作系统。

POSIX gettimeofdayclock_gettime函数是最接近平台独立性的东西。 理想情况下,所有平台都将遵循POSIX,但一个值得注意的臭名昭着(以及各种模糊不清的平台)不会。

虽然上面的答案肯定是正确的( c’est la vie ),但它们并不是很有用。

我在Windows XP下对Cygwin进行了一些测试:在我的机器上,gettimeofday()的粒度大约是15毫秒(1/64秒?)。 哪个很大。 以下是粒度:

  • clock_t clock(void)(除数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不起作用。

CYGWIN的其他可能性可能是RDTSC; 请参阅维基百科文章。 也许HPET,但它不适用于Windows XP。

另请注意,在Linux中,clock()是处理时间,而在Windows中则是挂起时间。

所以一些示例代码,包括标准Unix和在Windows下运行的CYGWIN代码,它的粒度大约为50微秒(在我的机器上):

 #if !CYGWIN double realElapsedTime(void) { // returns 0 first time called static struct timeval t0; struct timeval tv; gettimeofday(&tv, 0); if (!t0.tv_sec) // one time initialization t0 = tv; return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec) / 1000000.; } #else #include  double realElapsedTime(void) { // granularity about 50 microsecs static LARGE_INTEGER freq, start; LARGE_INTEGER count; if (!QueryPerformanceCounter(&count)) assert(0 && "QueryPerformanceCounter"); if (!freq.QuadPart) { // one time initialization if (!QueryPerformanceFrequency(&freq)) assert(0 && "QueryPerformanceFrequency"); start = count; } return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart; } #endif 

我将使用clock()和CLOCKS_PER_SEC的组合

time()几乎是所有C运行时库的标准,但只有1.0秒的分辨率。 在C++有BOOST ptime microsec_clock::universal_time()ptime microsec_clock::local_time()函数。