看到有兄弟问我如何使用CPU脉冲数来测量执行速度,这个其实很简单,读TSC寄存器(每个时钟脉冲TSC寄存器加一)而已,就是以下代码就可以了。由于汇编是VC风格的,所以这段代码仅仅用于Windows环境,使用方法看函数名就应该知道了,这应该是目前最精确的计时器了,可以用来衡量最核心代码的执行效率。
#ifndef __CPU_H__
#define __CPU_H__
#pragma warning ( push )
#pragma warning ( disable : 4035 )
class CCPU
{
private:
#ifdef WIN32
static unsigned int readTimeStampCounterLow()
{
_asm
{
_emit 0Fh ;RDTSC
_emit 31h
}
// returns eax
}
static unsigned int readTimeStampCounterHigh()
{
_asm
{
_emit 0Fh ;RDTSC
_emit 31h
mov eax, edx ;eax=edx
}
// returns eax
}
static unsigned __int64 readTimeStampCounter()
{
_asm
{
_emit 0Fh ;RDTSC
_emit 31h
}
// returns edx:eax
}
static void readTimeStampCounter(unsigned int *uHigh, unsigned int *uLow)
{
_asm
{
_emit 0Fh ;RDTSC
_emit 31h
mov ebx, uHigh
mov dword ptr [ebx], edx
mov ebx, uLow
mov dword ptr [ebx], eax
}
}
#endif
public:
unsigned int tH;
unsigned int tL;
void start_clock()
{
#ifdef WIN32
readTimeStampCounter(&tH,&tL);
#endif
}
int get_timespan()
{
#ifdef WIN32
unsigned int H;
unsigned int L;
readTimeStampCounter(&H,&L);
if(H==tH) return (L-tL);
else return(tL-L);
#else
return 0;
#endif
}
};
static CCPU CpuClock;
#pragma warning ( pop )
#endif //__CPU_H__