C++获取函数运行时间

第一种方法:
GetTickCount()获取系统启动后的时间间隔,精确度有限,跟CPU有关。
第二种方法:

QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以us为单位计时.但是它确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.

QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.

有了两个函数,可以将其封装在一个Time类中,从创建对象开始计时,直至对象销毁。

class Time {
public:
    Time() {
        QueryPerformanceFrequency(&nFreq);
        QueryPerformanceCounter(&nBeginTime);//开始计时  
    }
    ~Time()
    {
        QueryPerformanceCounter(&nEndTime);//停止计时  
        time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart;//计算程序执行时间单位为s  
        cout << "程序执行时间:" << time * 1000 << "ms" << endl;
    }
private:
    LARGE_INTEGER nFreq;
    LARGE_INTEGER nBeginTime;
    LARGE_INTEGER nEndTime;
    double time = 0;
};
void Test()
{
    Time t;
    for (int i = 0; i < 1000000; i++)
    {
    }
}
int main() {
    Test();
}

方法三:

在Linux下可用。
RDTSC指令,在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。这个精确性是上述几种方法所无法比拟的.在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31

#if defined (__i386__)
static __inline__ unsigned long long GetCycleCount(void)
{
        unsigned long long int x;
        __asm__ volatile("rdtsc":"=A"(x));
        return x;
}
#elif defined (__x86_64__)
static __inline__ unsigned long long GetCycleCount(void)
{
        unsigned hi,lo;
        __asm__ volatile("rdtsc":"=a"(lo),"=d"(hi));
        return ((unsigned long long)lo)|(((unsigned long long)hi)<<32);
}
#endif

void test8()
{
        unsigned long t1,t2;
        t1 = (unsigned long)GetCycleCount();
        foo();//dosomething
        t2 = (unsigned long)GetCycleCount();
        printf("Use Time:%f\n",(t2 - t1)*1.0/FREQUENCY); //FREQUENCY  CPU的频率
}

猜你喜欢

转载自blog.csdn.net/hanzheng6602/article/details/80802234