高精度计时

来源:互联网 发布:404页面 知乎 编辑:程序博客网 时间:2024/04/27 23:26

读取系统时间QueryPerformanceCounter()

LARGE_INTEGER tima,timb;
QueryPerformanceCounter(&tima);

在 Windows Server 2003 和 WindowsXP 中使用 QueryPerformanceCounter 函数的程序可能执行不当

因此应当首先调用QueryPerformanceFrequency()函数判断是否支持高精度性能计时器。

QueryPerformanceCounter 來精確計算執行時間
QueryPerformanceCounter 來精確計算執行時間
// 這個程式展示了如何使用QueryPerformanceCounter 來精確計算執行時間

#include <windows.h>
#include <iostream>
using namespace std;

void main(){
LARGE_INTEGER m_liPerfFreq={0};
QueryPerformanceFrequency(&m_liPerfFreq);

LARGE_INTEGER m_liPerfStart={0};
QueryPerformanceCounter(&m_liPerfStart);

for(int i=0; i< 100; i++)
cout << i << endl;

LARGE_INTEGER liPerfNow={0};
QueryPerformanceCounter(&liPerfNow);

int time=( ((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000)/m_liPerfFreq.QuadPart);

TCHAR buffer[100];
wsprintf(buffer,"執行時間 %d millisecond ",time);
MessageBox(NULL,buffer,"計算時間",MB_OK);
}

 

QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.
QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.
计算确切的时间是从第一次调用QueryPerformanceCounter()开始的
假设得到的LARGE_INTEGER为nStartCounter,过一段时间后再次调用该函数结束的,
设得到nStopCounter.
两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略.公式如下:  
                         nStopCounter-nStartCounter
ElapsedTime=------------------------------------ - overhead
frequency

double time=(nStopCounter.QuadPart-nStartCounter.QuadPart)/frequency.QuadPart

 

本文转载自http://hi.baidu.com/zorru/item/95da1711de0a2f6a70d5e804

原创粉丝点击