我正在分析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 :(得分:0)
处理器周期数是(差不多)差异。
LONGLONG cycles = stop.QuadPart - start.QuadPart;
转换为SECONDS的正确方法是:
double seconds = (double)cycles / (double)freq.QuadPart;
QueryPerformanceCounter
曾经作为RDTSC
的包装器实现,但这对现代时钟频率步进电源管理不起作用。因此,QPC现在通常是系统上的其他稳定时钟,因此它可能不一定是'CPU处理器周期'。
如果你真的想要真正的“CPU处理器周期”,那么你应该直接使用__rdtsc()
内在函数,但是请记住你没有一种强大的方法可以将它直接转换为时间 - 而且旧的AMD Athalon 64机器你有没有在核心之间同步的问题。
对ticks
(或已弃用的GetTickCCount64
)的调用保留使用GetTickCCount
,该调用将返回“以毫秒为单位的刻度”。