我在 C++ 中使用 time.h 来测量函数的时间。
clock_t t = clock();
someFunction();
printf("\nTime taken: %.4fs\n", (float)(clock() - t)/CLOCKS_PER_SEC);
但是,我总是将时间设为 0.0000。分开打印时,clock() 和 t 具有相同的值。我想知道是否有办法在 C++ 中精确测量时间(可能是纳秒级)。我正在使用VS2010。
我在 C++ 中使用 time.h 来测量函数的时间。
clock_t t = clock();
someFunction();
printf("\nTime taken: %.4fs\n", (float)(clock() - t)/CLOCKS_PER_SEC);
但是,我总是将时间设为 0.0000。分开打印时,clock() 和 t 具有相同的值。我想知道是否有办法在 C++ 中精确测量时间(可能是纳秒级)。我正在使用VS2010。
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
循环和分配begin
和end
var 也使用一些 CPU 时间。
我通常使用该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;
以下我完全同意的文本引用自Optimizing software in C++(适合任何 C++ 程序员的好读物) -
如果时间间隔很短,时间测量可能需要非常高的分辨率。在 Windows 中,您可以使用
GetTickCount
或QueryPerformanceCounter
函数进行毫秒分辨率。使用 CPU 中的时间戳计数器可以获得更高的分辨率,该计数器以 CPU 时钟频率计数。
有一个问题是“时钟频率可能会动态变化,并且由于中断和任务切换而导致测量不稳定”。
在 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);