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的实现代码。