在分析API调用时如何将滴答转换为时钟周期

时间:2015-03-29 18:56:03

标签: direct3d9

我正在分析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 :(得分: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,该调用将返回“以毫秒为单位的刻度”。

请参阅Acquiring high-resolution time stamps