我正在分析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,则数字在范围内......我只想检查我的方法......
答案 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