关于获取CPU的脉冲问题

本文介绍了一种使用CPU脉冲数(TSC)来精确测量代码执行速度的方法,通过汇编指令读取TSC寄存器值,适用于Windows环境下的VC开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到有兄弟问我如何使用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__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值