精确计算代码运行时间

    xiaoxiao2021-12-14  21

    QueryPerformanceFrequency()

    头文件:Windows.h 作用:返回硬件支持的高精度计数器的频率。 返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。

    此函数要求计算机要从硬件上支持高精度定时器。 函数原型:

    //返回计算机内部计时器的时钟频率 BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); //返回程序运行至此的记数 BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);

    在用此函数时,先通过QueryPerformanceFrequency()求出时钟频率来初始化,判断计算机是否支持此函数。通过程序运行前后的QueryPerformanceCounter()之差,再除去时钟频率来计算程序运行时间。

    用C++把函数封装:

    //ConputeTime.h #pragma once #include <iostream> #ifndef ComputeTime_h #define ComputeTime_h class ComputeTime { private: int Initialized; __int64 Frequency; __int64 BeginTime; public: bool Avaliable(); double End(); bool Begin(); ComputeTime(); virtual ~ComputeTime(); }; #endif //ComputeTime.cpp #include "ComputeTime.h" #include <iostream> #include <Windows.h> //QueryPerformanceFrequency函数需要Windows头文件 ComputeTime::ComputeTime() { Initialized = QueryPerformanceFrequency((LARGE_INTEGER *)&Frequency); //LARGE_INTEGER是64位的有符号整数 } ComputeTime::~ComputeTime() { } bool ComputeTime::Begin() { if (!Initialized) return 0; return QueryPerformanceCounter((LARGE_INTEGER *)&BeginTime); } double ComputeTime::End() { if (!Initialized) return 0; __int64 endtime; QueryPerformanceCounter((LARGE_INTEGER *)&endtime); __int64 elapsed = endtime - BeginTime; return ((double)elapsed / (double)Frequency)*1000.0; //单位由秒变为毫秒 } bool ComputeTime::Avaliable() { return Initialized; }

    可以看出测试时间很精确(单位毫秒)

    注:代码来自论文Grabcut in One Cut的实现代码。

    转载请注明原文地址: https://ju.6miu.com/read-962857.html

    最新回复(0)