精确的时间测量

我在C ++中使用time.h来测量函数的时间。

clock_t t = clock(); someFunction(); printf("\nTime taken: %.4fs\n", (float)(clock() - t)/CLOCKS_PER_SEC); 

不过,我总是把时间拿到0.0000。 时钟()和t分别打印时,具有相同的值。 我想知道是否有方法在C ++中精确地测量时间(可能是以纳秒为单位)。 我正在使用VS2010。

我通常使用QueryPerformanceCounter函数。

例:

 LARGE_INTEGER frequency; // ticks per second LARGE_INTEGER t1, t2; // ticks double elapsedTime; // get ticks per second QueryPerformanceFrequency(&frequency); // start timer QueryPerformanceCounter(&t1); // do something ... // stop timer QueryPerformanceCounter(&t2); // compute and print the elapsed time in millisec elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart; 

C ++ 11引入了chrono API ,可以用来得到纳秒:

 auto begin = std::chrono::high_resolution_clock::now(); // code to benchmark auto end = std::chrono::high_resolution_clock::now(); std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count() << "ns" << std::endl; 

对于一个更相关的值,多次运行该函数并计算平均值是很好的:

 auto begin = std::chrono::high_resolution_clock::now(); uint32_t iterations = 10000; for(uint32_t i = 0; i < iterations; ++i) { // code to benchmark } auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count(); std::cout << duration << "ns total, average : " << duration / iterations << "ns." << std::endl; 

但是记住for循环和分配beginend var也使用一些CPU时间。

我完全同意下面的文本是从C ++优化软件 (对于任何C ++程序员来说是很好的阅读)引用的 –

如果时间间隔很短,时间测量可能需要非常高的分辨率。 在Windows中,您可以使用GetTickCountQueryPerformanceCounter函数获取毫秒分辨率。 CPU中的时间戳记计数器可以获得更高的分辨率,该时间戳计数器以CPU时钟频率计数。

存在一个问题:“时钟频率可能dynamic变化,并且测量由于中断和任务切换而不稳定”。

在C或C ++中,我通常会像下面这样做。 如果仍然失败,你可以考虑使用rtdsc函数

  struct timeval time; gettimeofday(&time, NULL); // Start Time long totalTime = (time.tv_sec * 1000) + (time.tv_usec / 1000); //........ call your functions here gettimeofday(&time, NULL); //END-TIME totalTime = (((time.tv_sec * 1000) + (time.tv_usec / 1000)) - totalTime);