如何将刻度转换为时钟周期?

时间:2015-03-27 15:13:12

标签: c++ performance-testing performancecounter

我正在分析Direct3D9 API调用。我已经阅读了很多描述该过程的文档here。我有一个关于计算经过的时钟周期的问题。这是我目前的方法:

// measurement vars
LARGE_INTEGER start, stop, freq;

//
// flush command buffer here
//

// 
// issue begin query here
//

// start timer
QueryPerformanceCounter(&start);

//
//draw
//

//
// issue end query here and wait on results
//

// stop timer
QueryPerformanceCounter(&stop);

// calc elapsed ticks
stop.QuadPart -= start.QuadPart;

// get frequency
QueryPerformanceFrequency(&freq);

// ticks for easier handling
ULONG ticks = stop.QuadPart;

// calc elapsed clock cycles
cycles = (2.8E9 * ticks) / (double)freq.QuadPart;

我的问题涉及值2.8E9,它应该代表处理器的速度。这是计算时钟周期的正确方法吗?我正在分析单个API调用,我的结果与上面链接中的结果不同。如果我将处理器速度设置为1E9,则数字在范围内......我只想检查我的方法......

1 个答案:

答案 0 :(得分:-1)

引用您的来源,您使用的公式是:

  

周期= CPU速度*滴答数/ QPF

事实上,您在示例代码的最后一行中正是这样做的,其中"幻数" 2.8E9是CPU的速度,单位为Hz。因此,如果这是您的问题,答案是是的,您正在使用正确的公式。

如果您想用实际CPU速度替换幻数,请做好大量工作的准备。有关此问题的更多信息,请参阅答案 Finding out the CPU clock frequency (per core, per processor)


然而,为了获得可靠的分析结果,最好的方法是使用外部分析工具,因为当您更改代码以测量执行时间时,它实际上可能会对您要测量的事物产生影响(例如关于优化)。

检查wiki以获取一些合理的分析工具: http://en.wikipedia.org/wiki/List_of_performance_analysis_tools#C_and_C.2B.2B

除了您对CPU cicles的兴趣之外,更好的"侵入性"方法是使用C ++ 11标准库中的平台无关机制来测量经过的时间: http://en.cppreference.com/w/cpp/chrono/high_resolution_clock/now